O ile nie musisz mieć możliwości zmiany usuwania w czasie wykonywania, zdecydowanie zalecamy użycie niestandardowego typu usuwania. Na przykład, jeśli użyć wskaźnika funkcji dla Deleter, sizeof(unique_ptr<T, fptr>) == 2 * sizeof(T*)
. Innymi słowy, unique_ptr
marnowana jest połowa bajtów obiektu.
Pisanie niestandardowego narzędzia do pakowania w celu zawijania każdej funkcji jest jednak kłopotliwe. Na szczęście możemy napisać typ szablonu na funkcji:
Od 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>>;
my_unique_ptr<Bar, destroy> p{create()};
Przed 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>>;
my_unique_ptr<Bar, decltype(destroy), destroy> p{create()};
std::unique_ptr<Bar, decltype(&destroy)> ptr_;