boost:使用自定义删除器对shared_ptr进行序列化

时间:2018-06-17 07:31:37

标签: c++ serialization boost

我几乎可以肯定,提升序列化无法处理boost::shared_ptrstd::shared_ptr中的自定义删除工具。您当然必须为删除器编写序列化。删除器的类型擦除类似于std :: function,它不能被序列化。

其中一个问题是你不能在运行时推断出删除器的类型。如果可能,您可以使用带有删除类型和序列化处理程序的映射。

我能想到的唯一另一个丑陋的方法是假设所有删除都是从公共基类派生的,并为序列化注册派生类。

是否有更优雅的解决方案,不需要共同的基础?

1 个答案:

答案 0 :(得分:1)

  

我能想到的另一个丑陋的方法是假设所有删除都来自一个共同的基类

就是这样。考虑到你提出问题的方式,这是唯一的方法。

但是,您当然可以转换设计,并修复删除器。行为的差异可以从element_type成员数据驱动。

因此,如果您使元素类型包含未删除的删除器,则可以

  1. 只需将其序列化作为对象的一部分
  2. 写一个“实际”删除器来传递给它,例如:

    template <typename T>
    struct InvertedDeleter {
        void operator()(T* element) const {
            element->get_deleter()(element);
        }
    };