【问题标题】:boost: serialization of shared_ptr with custom deleterboost: 使用自定义删除器序列化 shared_ptr
【发布时间】:2018-06-17 07:31:37
【问题描述】:
我几乎可以肯定 boost 序列化无法处理 boost::shared_ptr 或 std::shared_ptr 中的自定义删除器。您当然必须为删除器编写序列化。类似于std::function的deleter有类型擦除,不能序列化。
其中一个问题是您无法在运行时推断删除器的类型。如果可能的话,您可以使用带有删除器类型和序列化处理程序的映射。
我能想到的唯一另一种丑陋的方法是假设所有删除器都派生自一个公共基类并注册派生类以进行序列化。
有没有更优雅的解决方案,不需要公共基础?
【问题讨论】:
标签:
c++
serialization
boost
【解决方案1】:
我能想到的唯一另一种丑陋的方法是假设所有删除器都派生自一个公共基类
就是这样。考虑到您提出问题的方式,这是唯一的方法。
但是,您当然可以转置设计,并修复删除器。行为上的差异可能来自 element_type 成员数据。
所以,如果你让元素类型包含非擦除删除器,你可以
- 只需将其序列化作为对象的一部分
-
写一个“实际的”删除器来传递给它,例如:
template <typename T>
struct InvertedDeleter {
void operator()(T* element) const {
element->get_deleter()(element);
}
};