有类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 。
我是一名优秀的程序员,十分优秀!