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

Posted

技术标签:

【中文标题】boost: 使用自定义删除器序列化 shared_ptr【英文标题】:boost: serialization of shared_ptr with custom deleter 【发布时间】:2018-06-17 07:31:37 【问题描述】:

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

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

我能想到的唯一另一种丑陋的方法是假设所有删除器都派生自一个公共基类并注册派生类以进行序列化。

有没有更优雅的解决方案,不需要公共基础?

【问题讨论】:

【参考方案1】:

我能想到的唯一另一种丑陋的方法是假设所有删除器都派生自一个公共基类

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

但是,您当然可以转置设计,并修复删除器。行为上的差异可能来自 element_type 成员数据。

所以,如果你让元素类型包含非擦除删除器,你可以

    只需将其序列化作为对象的一部分

    写一个“实际的”删除器来传递给它,例如:

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

【讨论】:

以上是关于boost: 使用自定义删除器序列化 shared_ptr的主要内容,如果未能解决你的问题,请参考以下文章

如何正确使用自定义 shared_ptr 删除器?

带有自定义删除器和分配器的 shared_ptr

以自定义方式提升序列化数据

Boost.Asio - 具有自定义缓冲区的多个缓冲区

Boost 序列化不适用于 shared_ptr<int>

boost::shared_ptr