Если вам не нужно иметь возможность изменять средство удаления во время выполнения, я настоятельно рекомендую использовать пользовательский тип удаления. Например, если использовать указатель на функцию для вашего Deleter, 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_;