如何检查某些东西是否可以用谷物序列化
How to check if something is serializable with cereal
我需要特征来检查是否可以使用谷物进行序列化。我已经用过
cereal::traits::is_output_serializable<T, cereal::BinaryOutputArchive>
cereal::traits::detail::count_output_serializers<T, cereal::BinaryOutputArchive>
(加上用于输入序列化的对称版本)。
在 if constexpr
中进行此类检查通过(即使我的类型不可序列化,计算结果为真)但后来它在谷物中中断,说完全相同的特征失败(!)我正在使用 T=cv::Mat
.
- 是否有替代检查可用?
- 知道为什么这样的事情可能会失败吗?我的存档类型有误吗?
我根据在 Cereal 中发现的一些静态断言编写了自己的代码。我有一个基本案例,其中包含我自己的代码所需的一系列专业化。需要专门化,因为基本情况对于 std::shared_ptr<T>
是正确的,即使 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, typename T>
static constexpr bool kHasCerealOutputArchiver<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, ARCHIVE>::value != 0;
// specialisation for vectors
template<typename ARCHIVE, typename T, typename A>
static constexpr bool kHasCerealInputArchiver<ARCHIVE, std::vector<T, A>> = kHasCerealInputArchiver<ARCHIVE, T>;
// specialisation for shared_ptrs
template<typename ARCHIVE, typename T>
static constexpr bool kHasCerealInputArchiver<ARCHIVE, std::shared_ptr<T>> = kHasCerealInputArchiver<ARCHIVE, T>;
// specialisation for shared_ptrs to const
template<typename ARCHIVE, typename T>
static constexpr bool kHasCerealInputArchiver<ARCHIVE, std::shared_ptr<const T>> = kHasCerealInputArchiver<ARCHIVE, T>;
我需要特征来检查是否可以使用谷物进行序列化。我已经用过
cereal::traits::is_output_serializable<T, cereal::BinaryOutputArchive>
cereal::traits::detail::count_output_serializers<T, cereal::BinaryOutputArchive>
(加上用于输入序列化的对称版本)。
在 if constexpr
中进行此类检查通过(即使我的类型不可序列化,计算结果为真)但后来它在谷物中中断,说完全相同的特征失败(!)我正在使用 T=cv::Mat
.
- 是否有替代检查可用?
- 知道为什么这样的事情可能会失败吗?我的存档类型有误吗?
我根据在 Cereal 中发现的一些静态断言编写了自己的代码。我有一个基本案例,其中包含我自己的代码所需的一系列专业化。需要专门化,因为基本情况对于 std::shared_ptr<T>
是正确的,即使 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, typename T>
static constexpr bool kHasCerealOutputArchiver<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, ARCHIVE>::value != 0;
// specialisation for vectors
template<typename ARCHIVE, typename T, typename A>
static constexpr bool kHasCerealInputArchiver<ARCHIVE, std::vector<T, A>> = kHasCerealInputArchiver<ARCHIVE, T>;
// specialisation for shared_ptrs
template<typename ARCHIVE, typename T>
static constexpr bool kHasCerealInputArchiver<ARCHIVE, std::shared_ptr<T>> = kHasCerealInputArchiver<ARCHIVE, T>;
// specialisation for shared_ptrs to const
template<typename ARCHIVE, typename T>
static constexpr bool kHasCerealInputArchiver<ARCHIVE, std::shared_ptr<const T>> = kHasCerealInputArchiver<ARCHIVE, T>;