如何使用带有 std::unique_ptr 成员的自定义删除器?

新手上路,请多包涵

我有一个带有 unique_ptr 成员的类。

 class Foo {
private:
    std::unique_ptr<Bar> bar;
    ...
};

Bar 是具有 create() 函数和 destroy() 函数的第三方类。

如果我想在独立功能中使用 std::unique_ptr ,我可以这样做:

 void foo() {
    std::unique_ptr<Bar, void(*)(Bar*)> bar(create(), [](Bar* b){ destroy(b); });
    ...
}

有没有办法以 std::unique_ptr 作为班级成员来做到这一点?

原文由 huitlarc 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 813
2 个回答

假设 createdestroy 是具有以下签名的免费函数(这似乎是 OP 的代码片段的情况):

 Bar* create();
void destroy(Bar*);

你可以这样写你的课 Foo

 class Foo {

    std::unique_ptr<Bar, void(*)(Bar*)> ptr_;

    // ...

public:

    Foo() : ptr_(create(), destroy) { /* ... */ }

    // ...
};

请注意,您不需要在此处编写任何 lambda 或自定义删除器,因为 destroy 已经是一个删除器。

原文由 Cassio Neri 发布,翻译遵循 CC BY-SA 3.0 许可协议

简单也是:

 class Foo {};
class Bar
{
public:
    Bar()
    {
        // actual initialisation at some point
    }

private:
    std::unique_ptr<Foo, void(*)(Foo*)> foo = {{}, {}}; // or = {nullptr, {}}
};

当然,您还可以创建一些辅助函数来完成这项工作,以便在任何时候都没有初始状态。

实际上,在您的特定场景中,最干净的方法是将您的 Bar (不是我的,抱歉造成混淆)放入一个简单的包装类中,这使得重用更容易。

原文由 IceFire 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题