我有一个以这种方式定义的课程:
template <typename T>
class MyMap
:public std::map<MyKey, T>
{
// ...
};
此类不添加任何成员,它只包装std::map
并提供一些辅助功能(为方便起见)。
现在,我的目标是使这个类与boost-serialization兼容。也就是说,我不仅需要支持序列化,还应该与具有相同模板参数的std::map
的序列化兼容。
如何实现这一目标?我试图按原样离开类(希望它从基类派生序列化) - 不编译。试图添加一个调用基数的serialize
的简单实现 - 不编译。
我也尝试添加我的实现。没关系,但它与std::map
的那个不兼容。
任何想法?提前谢谢。
提前致谢。
答案 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”有三种不同的方法:
- 侵入式方法:
醇>而不是侵入性和非侵入性的某些时候,术语侵入性和 使用非侵入性的。你只需提供啊STL的接口 容器需要。特别是,您需要通常的成员函数 容器如begin()和end()。这种方法是侵入性的 因为它要求以某种方式写入容器。
- 无创方法:
醇>您编写或提供用作接口的特殊迭代器 算法和特殊容器之间。这种方法是 无创。它所需要的是能够逐步完成所有这些工作 容器的元素,任何容器提供的能力 某种方式。
- 包装器方法
醇>结合前两种方法,编写一个包装类 使用类似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
);
};
}
}