gpt4 book ai didi

c++ - 如何为动态类型成员调用boost register_type函数

转载 作者:太空宇宙 更新时间:2023-11-04 13:42:49 25 4
gpt4 key购买 nike

有类A有指针 p到一些基类。我需要上课 A及其派生类可使用 boost 序列化进行序列化。制作p -member serializable 需要调用register_type<TYPE_OF_P>() .如何使用调用 register_type 的存档参数创建虚拟模板函数自己的类型名称为 p

#include <sstream>
#include <boost/archive/binary_oarchive.hpp>

struct Base
{
virtual ~Base() {}

template<class Archive>
void serialize(Archive &ar, const unsigned int version)
{
// ar & baseMember1
// ar & baseMember2
// ...
}
};

struct Derived : Base
{
virtual ~Derived() {}

template<class Archive>
void serialize(Archive &ar, const unsigned int version)
{
ar & boost::serialization::base_object<Base>(*this);
// ar & derivedMember1
// ar & derivedMember2
// ...
}
};

class A
{
public:
A() { p = 0; }
virtual ~A() = 0 { delete p; }

template<class Archive> // Must be like a virtual function member
/*virtual*/ void registerType(Archive &ar)
{
}

protected:
Base *p; // Initialize in a constructor
};

class B : public A
{
public:
B() { p = new Derived; }

//template<class Archive>
//virtual(!) void registerType(Archive &ar)
//{
// ar.register_type<Derived>();
//}
};

int main()
{
B b;
A *a = &b;

std::string s;
std::stringstream ss(s);
boost::archive::binary_oarchive oa(ss);

oa << a;
}

最佳答案

您是否正在寻找限定成员模板的语法?

class A
{
public:
A() { p = 0; }
virtual ~A() = 0 { delete p; }
A(A const&) = delete; // RULE OF THREE!
A& operator==(A const&) = delete;// RULE OF THREE!

template<class Archive>
void serialize(Archive &ar, unsigned)
{
ar.template register_type<Derived1>();
ar.template register_type<Derived2>();
ar.template register_type<Derived3>();
}

protected:
Base *p; // Initialize in a constructor
};

显然,成员模板不能是虚拟的。此外,这似乎是一个误入歧途的目标。

当您从新实例化的存档中反序列化时,请考虑一下。在开始反序列化之前,您需要告诉存档它可能遇到的所有动态类型。显然,您不能将工作留给派生类型本身,因为那样做就太晚了。

运行时动态是通过 typeid 进行查找,而不是类型本身。

导出类

不过还有一个其他机制:您可以使用 EXPORT 宏来使注册“自动”进行。这里的机制是单例机制,包含 header 和“调用”那些 EXPORT 宏的顺序至关重要。值得注意的是,您需要在类导出宏之前包含您可能希望在运行时使用的存档类型的所有存档 header 。

关于c++ - 如何为动态类型成员调用boost register_type函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27086723/

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