std :: unique_ptrのカスタム削除を安全にオーバーロードするにはどうすればよいですか?

アンキイ:

使用中のコードの重複を減らしようとしていますstd::unique_ptr。これはカスタムの削除ツールです。

1つのカスタムアロケーターを使用して割り当てられているいくつかのコンテナーFooBarあるので、で解放できませんdelete

したがって、現在のコードは次のとおりです。

struct UniqueFooDeleter
{
   void operator()(Foo* foo) 
   {
      internal_free(foo);
   }
};
using unique_foo_ptr = std::unique_ptr<Foo, UniqueFooDeleter>;

struct UniqueBarDeleter 
{
   void operator()(Bar* bar) 
   {
      internal_free(bar);
   }
};
using unique_bar_ptr = std::unique_ptr<Bar, UniqueBarDeleter>;

私はそれを次のように変更しました:

struct UniqueInternalDeleter
{
   void operator()(Bar* bar)
   {
      internal_free(bar);
   }

   void operator()(Foo* foo)
   {
      internal_free(foo);
   }
};
using unique_bar_ptr = std::unique_ptr<Bar, UniqueInternalDeleter>;
using unique_foo_ptr = std::unique_ptr<Foo, UniqueInternalDeleter>;

を介して割り当てられた任意の数のコンテナをs internal_freeとして使用できるようにするにはどうすればよいstd::unique_ptrですか?

ジェジョ:

あなたは作ることができるUniqueInternalDeleterようにテンプレートファンクタをしてstatic_assertいる場合、TではないですFoobar

#include <type_traits> // std::is_same_v

template<typename T>
struct UniqueInternalDeleter /* final */
{
   static_assert(std::is_same_v<T, Foo> || std::is_same_v<T, Bar>,
      " T must be either Foo or Bar");

   void operator()(T* barOrfoo)
   {
      internal_free(barOrfoo);
   }

private:
   void internal_free(T* barOrfoo)
   {
      if constexpr(std::is_same_v<T, Foo>)
         // code for `Foo*`
      else
         // code for `Bar*`

   }
};

これがために、より具体的には、あなたのエイリアスを作成BarしてFoo

using unique_bar_ptr = std::unique_ptr<Bar, UniqueInternalDeleter<Bar>>;
using unique_foo_ptr = std::unique_ptr<Foo, UniqueInternalDeleter<Foo>>;

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

スマートポインタ配列のサイズを取得するにはどうすればよいですか?(例:std :: unique_ptr <int []>)

分類Dev

`operator()`、 `std :: less`、` std :: greater`をオーバーロードせずに、 `std :: multiset`のカスタムコンパレータを提供するにはどうすればよいですか?

分類Dev

std :: unique_ptrカスタムデリータとして使用するために、noexcept-detectable、callableオブジェクトで関数をラップするクラステンプレートを作成するにはどうすればよいですか?

分類Dev

std :: unique_ptrの有効なC ++エイリアステンプレートを作成するにはどうすればよいですか?

分類Dev

std :: make_unique <派生>()をstd :: unique_ptr <base>に変換するにはどうすればよいですか?

分類Dev

ローカルのrawポインタからstd :: unique_ptrを初期化するのは安全ですか?

分類Dev

stdスマートポインタのカスタム削除機能を閉じるにはどうすればよいですか?

分類Dev

unique_ptrがベクター内にある場合、std :: unique_ptr <>が所有するオブジェクトへの参照/ ptrは安全ですか?

分類Dev

std :: unique_ptrを関数に渡すにはどうすればよいですか

分類Dev

std :: moveなしでunique_ptrを値で返すにはどうすればよいですか?

分類Dev

C ++:std :: unique_ptrを使用してオーバーロードされたoperator ++にアクセスする最良の方法は?

分類Dev

std :: powが2倍オーバーフローするかどうかを確認するにはどうすればよいですか

分類Dev

メンバー関数をstd :: functionにバインドするにはどうすればよいですか?

分類Dev

`std :: Variant`メンバーを持つクラスを安全にコピーするにはどうすればよいですか?

分類Dev

`std :: Variant`メンバーを持つクラスを安全にコピーするにはどうすればよいですか?

分類Dev

C ++でカスタムコンパレータを使用してstd :: setを作成するにはどうすればよいですか?

分類Dev

関数によって(std :: moveを介して)返されたunique_ptrがスコープ外になるのはいつですか

分類Dev

noexcept moveコンストラクターがない場合、std :: vectorを使用したコードはコンパイルされないのに、std :: unique_ptrを使用したコードはコンパイルされるのはなぜですか?

分類Dev

オーバーフローや未定義の動作のリスクを冒さずに、実際にstd :: chronoタイプを使用するにはどうすればよいですか?

分類Dev

Boost.Pythonのmap_indexing_suiteをカスタムではなくstdオブジェクトで使用するにはどうすればよいですか?

分類Dev

std :: shared_ptrをクラスメンバーとして使用するにはどうすればよいですか?

分類Dev

std :: stringのサイズを変更して、すべてのnullターミネータ文字を削除するにはどうすればよいですか?

分類Dev

オーバーロードされた関数「std :: make_unique」のインスタンスは引数リストに一致しませんが、unique_ptrコンストラクターで機能します

分類Dev

コンストラクターでstd :: optionalを使用するにはどうすればよいですか?

分類Dev

C ++ 2つの異なるstd :: lists内の同じ要素を参照するポインターを削除するにはどうすればよいですか?

分類Dev

std :: functionオブジェクトを使用してカスタム削除機能をstd :: unique_ptrに渡す

分類Dev

std :: arrayクラスのメンバーを静的にアサートしてc ++ 11でソートするにはどうすればよいですか?

分類Dev

std :: hash <>のデフォルトシードを変更するにはどうすればよいですか?

分類Dev

std :: list <std :: unique_ptr>をベクターに移動すると、削除された関数を参照しようとします

Related 関連記事

  1. 1

    スマートポインタ配列のサイズを取得するにはどうすればよいですか?(例:std :: unique_ptr <int []>)

  2. 2

    `operator()`、 `std :: less`、` std :: greater`をオーバーロードせずに、 `std :: multiset`のカスタムコンパレータを提供するにはどうすればよいですか?

  3. 3

    std :: unique_ptrカスタムデリータとして使用するために、noexcept-detectable、callableオブジェクトで関数をラップするクラステンプレートを作成するにはどうすればよいですか?

  4. 4

    std :: unique_ptrの有効なC ++エイリアステンプレートを作成するにはどうすればよいですか?

  5. 5

    std :: make_unique <派生>()をstd :: unique_ptr <base>に変換するにはどうすればよいですか?

  6. 6

    ローカルのrawポインタからstd :: unique_ptrを初期化するのは安全ですか?

  7. 7

    stdスマートポインタのカスタム削除機能を閉じるにはどうすればよいですか?

  8. 8

    unique_ptrがベクター内にある場合、std :: unique_ptr <>が所有するオブジェクトへの参照/ ptrは安全ですか?

  9. 9

    std :: unique_ptrを関数に渡すにはどうすればよいですか

  10. 10

    std :: moveなしでunique_ptrを値で返すにはどうすればよいですか?

  11. 11

    C ++:std :: unique_ptrを使用してオーバーロードされたoperator ++にアクセスする最良の方法は?

  12. 12

    std :: powが2倍オーバーフローするかどうかを確認するにはどうすればよいですか

  13. 13

    メンバー関数をstd :: functionにバインドするにはどうすればよいですか?

  14. 14

    `std :: Variant`メンバーを持つクラスを安全にコピーするにはどうすればよいですか?

  15. 15

    `std :: Variant`メンバーを持つクラスを安全にコピーするにはどうすればよいですか?

  16. 16

    C ++でカスタムコンパレータを使用してstd :: setを作成するにはどうすればよいですか?

  17. 17

    関数によって(std :: moveを介して)返されたunique_ptrがスコープ外になるのはいつですか

  18. 18

    noexcept moveコンストラクターがない場合、std :: vectorを使用したコードはコンパイルされないのに、std :: unique_ptrを使用したコードはコンパイルされるのはなぜですか?

  19. 19

    オーバーフローや未定義の動作のリスクを冒さずに、実際にstd :: chronoタイプを使用するにはどうすればよいですか?

  20. 20

    Boost.Pythonのmap_indexing_suiteをカスタムではなくstdオブジェクトで使用するにはどうすればよいですか?

  21. 21

    std :: shared_ptrをクラスメンバーとして使用するにはどうすればよいですか?

  22. 22

    std :: stringのサイズを変更して、すべてのnullターミネータ文字を削除するにはどうすればよいですか?

  23. 23

    オーバーロードされた関数「std :: make_unique」のインスタンスは引数リストに一致しませんが、unique_ptrコンストラクターで機能します

  24. 24

    コンストラクターでstd :: optionalを使用するにはどうすればよいですか?

  25. 25

    C ++ 2つの異なるstd :: lists内の同じ要素を参照するポインターを削除するにはどうすればよいですか?

  26. 26

    std :: functionオブジェクトを使用してカスタム削除機能をstd :: unique_ptrに渡す

  27. 27

    std :: arrayクラスのメンバーを静的にアサートしてc ++ 11でソートするにはどうすればよいですか?

  28. 28

    std :: hash <>のデフォルトシードを変更するにはどうすればよいですか?

  29. 29

    std :: list <std :: unique_ptr>をベクターに移動すると、削除された関数を参照しようとします

ホットタグ

アーカイブ