首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >继承std::容器,包括它的boost序列化

继承std::容器,包括它的boost序列化
EN

Stack Overflow用户
提问于 2013-01-29 03:32:43
回答 3查看 198关注 0票数 0

我有一个这样定义的类:

代码语言:javascript
复制
template <typename T>
class MyMap
    :public std::map<MyKey, T>
{
    // ...
};

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

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

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

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

有什么建议吗?提前谢谢。

提前谢谢。

EN

回答 3

Stack Overflow用户

发布于 2013-01-29 03:56:39

阅读中的基类部分

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2013-01-29 04:02:00

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

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

  1. The invasive:

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

  1. 非侵入性方法:

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

的包装器方法

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

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

票数 0
EN

Stack Overflow用户

发布于 2013-01-29 04:39:14

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

在您的例子中,类似这样的东西将会起作用:

代码语言:javascript
复制
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    
                );                                               
        };                                                   
    }                                                    
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14569706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档