继承一个std :: container,包括它的boost序列化

时间:2013-01-28 19:32:43

标签: c++ serialization boost

我有一个以这种方式定义的课程:

template <typename T>
class MyMap
    :public std::map<MyKey, T>
{
    // ...
};

此类不添加任何成员,它只包装std::map并提供一些辅助功能(为方便起见)。

现在,我的目标是使这个类与boost-serialization兼容。也就是说,我不仅需要支持序列化,还应该与具有相同模板参数的std::map的序列化兼容。

如何实现这一目标?我试图按原样离开类(希望它从基类派生序列化) - 不编译。试图添加一个调用基数的serialize的简单实现 - 不编译。

我也尝试添加我的实现。没关系,但它与std::map的那个不兼容。

任何想法?提前谢谢。

提前致谢。

3 个答案:

答案 0 :(得分:1)

阅读 Serialization documentation

中的基类部分
template<class Archive>
void serialize(Archive &ar, const unsigned int version)
{
    ar & boost::serialization::base_object<std::map<MyKey, T>>(*this);

    //Serialize your stuff after the base class
}

答案 1 :(得分:0)

从书The C++ Standard Library: A Tutorial and Reference的第6.7节开始:

  

制作容器“STL-able”有三种不同的方法:

     
      
  1. 侵入式方法:
  2.         

    而不是侵入性和非侵入性的某些时候,术语侵入性和   使用非侵入性的。你只需提供啊STL的接口   容器需要。特别是,您需要通常的成员函数   容器如begin()和end()。这种方法是侵入性的   因为它要求以某种方式写入容器。

         
        
    1. 无创方法:
    2.         

      您编写或提供用作接口的特殊迭代器   算法和特殊容器之间。这种方法是   无创。它所需要的是能够逐步完成所有这些工作   容器的元素,任何容器提供的能力   某种方式。

           
          
      1. 包装器方法
      2.         

        结合前两种方法,编写一个包装类   使用类似STL容器的接口封装任何数据结构。

如果你的意思是使用包装器方法支持std :: map的附加/不同功能,你应该在地图包装类中封装地图,而不是从std :: map继承。 / p>

答案 2 :(得分:0)

您可以强制在类中实例化boost :: serialization :: implementation_level_impl。 (这就是由BOOST_CLASS_IMPLEMENTATION创建的)

在你的情况下,这样的事情会起作用:

template <typename T>
class MyMap
    :public std::map<MyKey, T>
{
    boost::serialization::implementation_level_impl<MyMap<T>> temp; //Causes template instantiation
};

namespace boost {                                    
    namespace serialization {      
        template <typename T>
        struct implementation_level_impl< const MyMap<T> >                     
        {                                                    
            typedef mpl::integral_c_tag tag;                 
            typedef mpl::int_< boost::serialization::object_serializable > type;                     
            BOOST_STATIC_CONSTANT(                           
                int,                                         
                value = implementation_level_impl::type::value    
                );                                               
        };                                                   
    }                                                    
}