gpt4 book ai didi

c++ - 使用 Cereal 序列化库中的模板化多态类型

转载 作者:太空狗 更新时间:2023-10-29 21:14:43 24 4
gpt4 key购买 nike

我有一个模板化的基类:

template<typename T>
class A {
public:
T a;

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

以及派生自它的模板类:

template<typename T>
class B : public A<T> {
public:
T b;

template<class Archive>
void serialize(Archive & ar) {
ar(cereal::base_class<A<T>>(this));
ar(b);
}
};

在另一个序列化类中使用:

template<typename T>
class C {

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

std::vector<std::shared_ptr<A<T>>> collection;
};

这段代码和使用它的代码被编译成一个静态库

根据我对 Cereal 文档的理解,我需要添加

CEREAL_REGISTER_TYPE(A<double>)
CEREAL_REGISTER_TYPE(A<float>)

CEREAL_REGISTER_TYPE(B<double>)
CEREAL_REGISTER_TYPE(B<float>)

在每个类的头文件中为将要使用的每种类型等

这编译。但是有一个运行时错误

Trying to save an unregistered polymorphic type (B). Make sure your type is registered with CEREAL_REGISTER_TYPE and that the archive you are using was included (and registered with CEREAL_REGISTER_ARCHIVE) prior to calling CEREAL_REGISTER_TYPE. If your type is already registered and you still see this error, you may need to use CEREAL_REGISTER_DYNAMIC_INIT.

从文档中我认为我需要在标题中添加 CEREAL_FORCE_DYNAMIC_INIT(libname) 并在 CPP 文件中添加 CEREAL_REGISTER_DYNAMIC_INIT,但是没有 cpp 文件。或者一个合适的 CPP 文件来放置它。

添加 CEREAL_REGISTER_POLYMORPHIC_RELATION 不会像预期的那样产生任何影响,因为 B 的序列化函数正在调用基类 Acereal::基类有没有办法使用 Cereal 来序列化模板类?

最佳答案

问题归结为包含 header 的顺序和包含它们的位置,以及少量的 RTFM。

在需要的基类头中:

#include <cereal/types/polymorphic.hpp>
#include <cereal/archives/portable_binary.hpp>

加上我想要序列化的任何其他类型。

然后在子类中为每个支持的类型添加 CEREAL_REGISTER_TYPE

如文档中所述,关键是存档类型包含在 BEFORE CEREAL_REGISTER_TYPE 中。它们不必与类声明位于同一文件中。只需在注册类型之前包含 header 。

关于c++ - 使用 Cereal 序列化库中的模板化多态类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40154922/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com