继承 std::容器,包括其提升序列化

Inheriting an std::container including its boost serialization

本文关键字:升序 包括其 序列化 std 容器 继承      更新时间:2023-10-16

>我有一个这样定义的类:

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

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

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

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

我还尝试添加我的实现。没关系,但与std::map不兼容.

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

提前谢谢。

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

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
}

摘自《C++标准库:教程和参考》一书的第 6.7 节:

有三种不同的方法可以使容器"可STL":

  1. 侵入性方法:
而不是侵入性和非侵入性有时术语

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

  1. 非侵入性方法:

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

  1. 包装器方法

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

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

您可以在类中强制实例化 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    
                );                                               
        };                                                   
    }                                                    
}