ज्यादातर मामलों std::unique_ptr
में (लेकिन सुरक्षित) प्रतिस्थापन में ड्रॉप करने के लिए बनाया गया था std::auto_ptr
, इसलिए बहुत कम (यदि कोई हो) कोड को छोड़कर अन्य आवश्यक परिवर्तन होना चाहिए (जैसा कि आप पूछते हैं) कोड को unique_ptr
या तो उपयोग करने के लिए निर्देशित करना auto_ptr
।
ऐसा करने के कुछ तरीके (और प्रत्येक नीचे अपनी स्वयं की सूची के साथ आता है)। प्रदान किए गए कोड नमूने को देखते हुए, मैं पहले दो विकल्पों में से किसी एक का पक्ष लूंगा ।
विकल्प 1
#if __cplusplus >= 201103L
template <typename T>
using auto_ptr = std::unique_ptr<T>;
#else
using std::auto_ptr;
#endif
समझौतों से;
- आप
auto_ptr
वैश्विक नामस्थान में नाम का परिचय देते हैं ; आप इसे परिभाषित करके इसे अपने स्वयं के "निजी" नामस्थान कह सकते हैं
- एक बार C ++ 17 में माइग्रेट करने के बाद (मेरा मानना है कि
auto_ptr
पूरी तरह से हटा दिया जाएगा) आप अधिक आसानी से खोज और बदल सकते हैं
विकल्प 2
template <typename T>
struct my_ptr {
#if __cplusplus >= 201103L
typedef std::unique_ptr<T> ptr;
#else
typedef std::auto_ptr<T> ptr;
#endif
};
समझौतों से;
- संभवतः अधिक बोझिल काम करने के लिए, सभी वर्तमान
auto_ptr
को कोड में बदलने की आवश्यकता है जैसे कुछmy_ptr<T>::ptr
- बेहतर सुरक्षा के नाम वैश्विक नामस्थान में पेश नहीं किए जा रहे हैं
विकल्प 3
कुछ हद तक विवादास्पद, लेकिन अगर आप std
एक आधार के रूप में एक वर्ग होने के गुटों के साथ तैयार हैं
#if __cplusplus >= 201103L
template <typename T>
using my_ptr = std::unique_ptr<T>;
#else
template <typename T>
class my_ptr : public std::auto_ptr<T> {
// implement the constructors for easier use
// in particular
explicit my_ptr( X* p = 0 ) : std::auto_ptr(p) {}
};
#endif
समझौतों से;
- विरासत में मिले वर्ग का उपयोग करने की कोशिश न करें जहां एक आभासी आधार (विशेष रूप से गैर-आभासी विध्वंसक) की उम्मीद की जाएगी। ऐसा नहीं है कि यह मामले में एक मुद्दा होना चाहिए - लेकिन इसके बारे में पता होना चाहिए
- फिर से, कोड बदल जाता है
- संभावित नाम स्थान बेमेल है - यह सब इस बात पर निर्भर करता है कि पॉइंटर क्लास का उपयोग किस तरह से शुरू करने के लिए किया जाता है
विकल्प 4
एक नई कक्षा में पॉइंटर्स लपेटें और सदस्य को आवश्यक कार्य एकत्र करें
template <typename T>
class my_ptr { // could even use auto_ptr name?
#if __cplusplus >= 201103L
std::unique_ptr<T> ptr_;
#else
std::auto_ptr<T> ptr_;
#endif
// implement functions required...
T* release() { return ptr_.release(); }
};
समझौतों से;
- थोड़ा चरम जब आप वास्तव में चाहते हैं तो कार्यान्वयन को "स्वैप" करना है
auto_ptr
स्कोप्ड (यानीstd::auto_ptr
) है, क्या उन्हें कुछ अन्य नामस्थानों से स्मार्ट पॉइंटर प्राप्त करने की आवश्यकता है या हो सकती है?