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

问题描述

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

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

Foo你可以这样写你的课

class Foo {

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

    // ...

public:

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

    // ...
};

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

解决方法

我有一个带有 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作为班级成员,有没有办法做到这一点?