继承 std::容器,包括其提升序列化
Inheriting an std::container including its boost serialization
>我有一个这样定义的类:
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":
而不是侵入性和非侵入性有时术语
- 侵入性方法:
侵入性和 使用非侵入式。你只需提供啊STL的接口 容器要求。特别是,您需要通常的成员函数 容器,如 begin() 和 end()。这种方法是侵入性的 因为它要求以某种方式编写容器。
- 非侵入性方法:
编写或提供用作接口的特殊迭代器 在算法和特殊容器之间。这种方法是 无 创。它所需要的只是能够逐步完成所有 容器的元素,任何容器都提供的能力 某种方式。
- 包装器方法
结合前面的两种方法,您可以编写一个包装器类 使用类似 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
);
};
}
}
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 如何在 C 中正确使用 libiconv 使其不会报告"Arg list too long"?
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 按对象的特定方法按升序排列的C++优先级队列
- C++使用数组作为多维数组,尽管将其初始化为带有指针的 1D
- 获取字符串的长度并将其分配给数组
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- Windows 10-使用gtkmm-3.0库和g++[包括再现]的分段故障
- 这是我尝试让用户将值输入到数组中.然后将其隐藏为大量的星号
- EvtExportLogneneneba API正在将远程计算机的事件日志保存到远程PC本身.如何将其保存到主机
- 为什么 cmake 许可证<>样式不包括?
- 类型总是使用其大小存储在内存中吗
- 计算平均值,不包括上次得分
- 是否有有效的标准算法来栅格化面,包括其内部区域
- 我如何确保修改.H文件时,使用Visual Studio 2008将包括其在内的.cc文件自动编译
- #包括在功能体内部或降低其可见性
- 使用STL类而不包括其适当的头
- 无法使用标头保护解决包含其自身的文件(包括标头)的错误
- 继承 std::容器,包括其提升序列化