我有一个这样定义的类:
template <typename T>
class MyMap
:public std::map<MyKey, T>
{
// ...
};这个类没有添加任何成员,它只是包装了std::map并提供了一些辅助函数(为了方便起见)。
现在,我的目标是使这个类与boost-serialization兼容。也就是说,我不仅需要支持序列化,它还应该与具有相同模板参数的std::map的序列化兼容。
如何做到这一点?我试着让类保持原样(希望它能从基类派生序列化)--不能编译。尝试添加一个调用基础的serialize的简单实现--没有编译。
我还尝试添加我的实现。这是可以的,但它与std::map的不兼容。
有什么建议吗?提前谢谢。
提前谢谢。
发布于 2013-01-29 03:56:39
阅读中的基类部分
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-29 04:02:00
摘自The C++ Standard Library: A Tutorial and Reference一书的第6.7节
有三种不同的方法可以使容器“可用STL”:
有时使用术语侵入式和非侵入性来代替侵入式和非侵入性。您只需提供ah容器所需的接口。特别是,您需要容器的常用成员函数,如begin()和end()。这种方法是有侵入性的,因为它需要以某种方式编写容器。
您可以编写或提供特殊的迭代器,将其用作算法和特殊容器之间的接口。这种方法是非侵入性的。它所需要的是遍历容器的所有元素的能力,这是任何容器以某种方式提供的能力。
的包装器方法
结合前面的两种方法,您将编写一个包装器类,它用一个类似STL容器的接口封装任何数据结构。
如果您打算使用包装器方法支持std::map的附加/不同功能,则应该将映射封装在包装器类中,而不是从std::map继承。
发布于 2013-01-29 04:39:14
您可以在类中强制实例化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
);
};
}
}https://stackoverflow.com/questions/14569706
复制相似问题