1. ホーム
  2. c++

[解決済み] std::unique_ptr のメンバーでカスタムデレタを使用するにはどうすればよいですか?

2022-04-25 10:58:09

質問

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 をクラスのメンバーとして使用できますか?

どのように解決するのですか?

と仮定すると createdestroy は、以下のシグネチャを持つ自由関数(OPのコードスニペットからはそう見える)です。

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

クラスを書くことができます Foo このように

class Foo {

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

    // ...

public:

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

    // ...
};

ここで、ラムダやカスタムデレタを書く必要がないことに注意してください。 destroy はすでにデレタです。