Siliciyi çalışma zamanında değiştirebilmeniz gerekmedikçe, özel bir silici türü kullanmanızı şiddetle tavsiye ederim. Örneğin, siliciniz için bir işlev işaretçisi kullanıyorsanız sizeof(unique_ptr<T, fptr>) == 2 * sizeof(T*)
,. Başka bir deyişle, baytların yarısıunique_ptr
nesnenin boşa harcanır.
Yine de, her işlevi sarmak için özel bir silici yazmak zahmetlidir. Neyse ki, fonksiyon üzerine şablonlu bir tip yazabiliriz:
C ++ 17'den beri:
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'den önce:
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_;