ถ้าคุณไม่จำเป็นต้องสามารถเปลี่ยน deleter ในรันไทม์ได้ฉันขอแนะนำอย่างยิ่งให้ใช้ประเภท deleter ที่กำหนดเอง ตัวอย่างเช่นถ้าใช้ตัวชี้ฟังก์ชันสำหรับ Deleter sizeof(unique_ptr<T, fptr>) == 2 * sizeof(T*)
ของคุณ กล่าวอีกนัยหนึ่งครึ่งหนึ่งของไบต์ของunique_ptr
วัตถุจะเสียไป
การเขียน deleter ที่กำหนดเองเพื่อตัดทุกฟังก์ชันเป็นเรื่องที่น่ารำคาญ โชคดีที่เราสามารถเขียนประเภทแม่แบบในฟังก์ชัน:
ตั้งแต่ 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_;