0

我有一个这样定义的类:

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

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

现在,我的目标是使此类增强序列化兼容。也就是我不仅要支持序列化,还要兼容std::map同模板参数的序列化。

如何做到这一点?我试图让类保持原样(希望它会从基类派生序列化) - 无法编译。试图添加一个serialize调用基础的简单实现 - 无法编译。

我还尝试添加我的实现。可以的,但是不兼容std::map

有什么想法吗?提前致谢。

提前致谢。

4

3 回答 3

1

阅读序列化文档中的基类部分

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
}
于 2013-01-28T19:56:38.977 回答
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    
                );                                               
        };                                                   
    }                                                    
}
于 2013-01-28T20:39:13.620 回答
0

摘自The C++ Standard Library: A Tutorial and Reference一书的第 6.7 节:

有三种不同的方法可以使容器“支持 STL”:

  1. 侵入性方法:

有时使用术语侵入性和非侵入性来代替侵入性和非侵入性。您只需提供啊 STL 容器所需的接口。特别是,您需要容器的常用成员函数,例如 begin() 和 end()。这种方法是侵入性的,因为它要求以某种方式编写容器。

  1. 无创方法:

您编写或提供特殊迭代器,用作算法和特殊容器之间的接口。这种方法是非侵入性的。它所需要的只是能够遍历容器的所有元素,任何容器都以某种方式提供的能力。

  1. 包装方法

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

如果您打算使用包装器方法支持 std::map 的附加/不同功能,则应将映射封装在包装器类中,而不是从 std::map 继承。

于 2013-01-28T20:02:00.243 回答