जब तक आपको रन-वे पर डिलेटर को बदलने में सक्षम होने की आवश्यकता नहीं होती, मैं दृढ़ता से कस्टम डिलेटर प्रकार का उपयोग करने की सलाह दूंगा। उदाहरण के लिए, अपने 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_;