如何解决如何检查某些东西是否可以用谷物序列化
我需要 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 举报,一经查实,本站将立刻删除。