A menos que você precise alterar o deleter em tempo de execução, recomendo fortemente o uso de um tipo personalizado. Por exemplo, se você usar um ponteiro de função para seu deleter sizeof(unique_ptr<T, fptr>) == 2 * sizeof(T*)
,. Em outras palavras, metade dos bytes do unique_ptr
objeto são desperdiçados.
Escrever um deleter personalizado para agrupar todas as funções é um problema. Felizmente, podemos escrever um tipo de modelo na função:
Desde 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()};
Antes do 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_;