微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何检查某些东西是否可以用谷物序列化

如何解决如何检查某些东西是否可以用谷物序列化

我需要 trait 来检查是否可以使用谷物进行序列化。我已经用了

cereal::traits::is_output_serializable<T,cereal::BinaryOutputArchive>
cereal::traits::detail::count_output_serializers<T,cereal::BinaryOutputArchive>

加上用于输入序列化的对称版本)。

将此类检查放入 if constexpr 通过(即使我的类型不可序列化也评估为真)但后来它在谷物中中断,说完全相同的特征失败(!)我正在使用 {{1} }.

  • 是否有其他可用的支票?
  • 知道为什么这样的事情可能会失败吗?我的存档类型有误吗?

解决方法

我根据在 Cereal 中找到的一些静态断言编写了自己的断言。我有一个基本案例,其中包含我自己的代码所需的一系列专业。需要特化,因为即使 T 本身不可序列化,std::shared_ptr<T> 的基本情况也是如此。

    /// Meta programming constant,can you serialise the type T to the Cereal archive ARCHIVE?
    template<typename ARCHIVE,typename T>
    static constexpr bool kHasCerealOutputArchiver
      = not std::is_pointer<T>::value and cereal::traits::detail::count_output_serializers<T,ARCHIVE>::value != 0;

    // specialisation for vectors
    template<typename ARCHIVE,typename T,typename A>
    static constexpr bool kHasCerealOutputArchiver<ARCHIVE,std::vector<T,A>> = kHasCerealOutputArchiver<ARCHIVE,T>;

    // specialisation for shared_ptrs
    template<typename ARCHIVE,typename T>
    static constexpr bool kHasCerealOutputArchiver<ARCHIVE,std::shared_ptr<T>> = kHasCerealOutputArchiver<ARCHIVE,T>;

    // specialisation for shared_ptrs to const
    template<typename ARCHIVE,std::shared_ptr<const T>> = kHasCerealOutputArchiver<ARCHIVE,T>;


    /// Meta programming constant,can you serialise the type T from the Cereal archive ARCHIVE?
    template<typename ARCHIVE,typename T>
    static constexpr bool kHasCerealInputArchiver
      = not std::is_pointer<T>::value and cereal::traits::detail::count_input_serializers<T,typename A>
    static constexpr bool kHasCerealInputArchiver<ARCHIVE,A>> = kHasCerealInputArchiver<ARCHIVE,typename T>
    static constexpr bool kHasCerealInputArchiver<ARCHIVE,std::shared_ptr<T>> = kHasCerealInputArchiver<ARCHIVE,std::shared_ptr<const T>> = kHasCerealInputArchiver<ARCHIVE,T>;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。