1

default_deleterに変更したいstd::unique_ptr。これは非常に簡単に実現できますが、不便な点が 1 つあります。次のように、1 つではなく 2 つのテンプレート パラメーターを使用して変数を宣言する必要があります。

std::unique_ptr<MyType, MyDeleter<MyType>> myVar;

ご覧のとおり、宣言は長く、短いバージョンを使用できる気がしますが、方法がわかりません:)

MyUniquePtr<T>と同じになるようなものを宣言することは可能std::unique_ptr<T, MyDeleter<T>>ですか?

編集:Matthieu M. は既に回答していますが、残念ながら、この機能は実装されていないため、Visual Studio では使用できません。この動作を行う他の方法はありますか?

4

5 に答える 5

8

実際には、テンプレートのエイリアスを使用して:

template <typename T>
using MyUniquePtr = std::unique_ptr<T, MyDeleter<T>>;
于 2013-06-13T14:45:46.133 に答える
3

あなたのデリータは、削除されるオブジェクトのタイプでテンプレート化する必要がありますか?それとも、削除されるオブジェクトのタイプで関数呼び出し演算子をテンプレート化するだけで十分ですか?

それ以外の:

template<typename T>
struct MyDeleter
{
    void operator()(T* p) const { /* ... */ }
};

書けますか:

struct MyDeleter
{
    template<typename T>
    void operator()(T* p) const { /* ... */ }
};

もちろん、これはどの状態MyDeleterを維持する必要があるかによって異なります。

于 2013-06-13T15:50:24.243 に答える
0

カスタム割り当て/削除戦略に特化した代わりに、独自のバージョンのmake_uniqueスタイル関数を作成することを検討することをお勧めします。これには、特殊なリソースの取得/割り当てを例外的に安全な方法で実行できるという利点もあります。次に、unique_ptr を auto として宣言し、型推論を機能させることができます。

于 2013-06-13T17:29:44.900 に答える