Trừ khi bạn cần có khả năng thay đổi deleter trong thời gian chạy, tôi thực sự khuyên bạn nên sử dụng một loại deleter tùy chỉnh. Ví dụ: nếu sử dụng một con trỏ hàm cho deleter của bạn , sizeof(unique_ptr<T, fptr>) == 2 * sizeof(T*)
. Nói cách khác, một nửa số byte của unique_ptr
đối tượng bị lãng phí.
Tuy nhiên, viết một deleter tùy chỉnh để bọc mọi chức năng là một điều phiền phức. Rất may, chúng ta có thể viết một kiểu templated trên hàm:
Kể từ 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()};
Trước 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_;