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