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

时间:2014-11-23 07:46:04

标签: c++ templates serialization boost virtual-functions

有一个类A,它有一个指针p到某个基类。我需要使用boost序列化使类A及其派生类可序列化。要使p - 成员可序列化,需要调用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;
}

1 个答案:

答案 0 :(得分:0)

您是否在寻找合格会员模板的语法?

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宏进行注册&#34;自动&#34;。这里的机制是单例的机制,以及包含标题和&#34;调用&#34;的顺序。那些EXPORT宏是最重要的。值得注意的是,您需要在类导出宏之前包含可能希望在运行时中使用的归档类型的所有归档头。