2

std::chrono::minutes をシリアルまたは一般的にシリアル化するにはどうすればよいですか?

私はこれを試しました

struct A {
    std::chrono::minutes m;

    template <class Archive>
    void serialize(Archive& ar) { 
        ar(m);
    }
};
int main()    
{
        A a;

        std::ostringstream os;
        cereal::JSONOutputArchive ar1(os);
        ar1(cereal::make_nvp("A", a));

        A result;
        std::istringstream is(os.str());
        cereal::JSONInputArchive ar2(is);
        ar2(cereal::make_nvp("A", result));

        if (a.m != result.m)
            std::cout << "error\n";
}

しかし、Visual Studio 2015 でエラーが発生します

1>   Types must either have a serialize function, load/save pair, or load_minimal/save_minimal pair (you may not mix these).
1>   Serialize functions generally have the following signature:
1>
1>   template<class Archive>
1>     void serialize(Archive & ar)
1>     {
1>       ar( member1, member2, member3 );
1>     }
1>
1>
1>  cereal.hpp(702): note: see reference to function template instantiation 'ArchiveType &cereal::InputArchive<ArchiveType,0>::processImpl<std::chrono::minutes,0>(const T &)' being compiled
1>          with
1>          [
1>              ArchiveType=cereal::JSONInputArchive,
1>              T=std::chrono::minutes
1>          ]

理想的には、移植可能な方法でシリアライズおよびデシリアライズしたいと考えています。

cereal/types/chrono.hpp をインクルードし、次のように変更することで問題を解決したと思います

#include <cereal/types/chrono.hpp>
class A {
    std::chrono::minutes m;

    friend class cereal::access;

    template <class Archive>
    void serialize(Archive& ar)
    { 
        ar(m);
    }
};
4

1 に答える 1

2

std::chrono::minuteあなたが発見したように、実際には であるのサポートは、シリアルに含まれている をstd::chrono::duration含めることで見つけることができます。cereal/types/chrono.hpp

于 2016-10-12T18:47:11.770 に答える