実行時に削除を変更できるようにする必要がない限り、カスタムの削除タイプを使用することを強くお勧めします。たとえば、あなたのデリータの関数ポインタを使用している場合、sizeof(unique_ptr<T, fptr>) == 2 * sizeof(T*)
。つまり、unique_ptr
オブジェクトのバイトの半分が無駄になります。
ただし、すべての関数をラップするカスタム削除機能を作成するのは面倒です。ありがたいことに、関数にテンプレート化された型を書くことができます:
C ++ 17以降:
template <auto fn>
using deleter_from_fn = std::integral_constant<decltype(fn), fn>;
template <typename T, auto fn>
using my_unique_ptr = std::unique_ptr<T, deleter_from_fn<fn>>;
// usage:
my_unique_ptr<Bar, destroy> p{create()};
C ++ 17より前:
template <typename D, D fn>
using deleter_from_fn = std::integral_constant<D, fn>;
template <typename T, typename D, D fn>
using my_unique_ptr = std::unique_ptr<T, deleter_from_fn<D, fn>>;
// usage:
my_unique_ptr<Bar, decltype(destroy), destroy> p{create()};
std::unique_ptr<Bar, decltype(&destroy)> ptr_;