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

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>;