বেশিরভাগ ক্ষেত্রেই এর 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
Tradeoffs;
- আপনি
auto_ptr
বিশ্বব্যাপী নেমস্পেসে নামটি প্রবর্তন করেন ; আপনি এটি আপনার নিজস্ব "ব্যক্তিগত" নাম স্থানটি নির্ধারণ করে এটিকে প্রশমিত করতে পারেন
- একবার সি ++ 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
};
Tradeoffs;
- সম্ভবত আরও জটিল হয়ে কাজ করার জন্য, সমস্ত বর্তমানের কোডটিতে
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
Tradeoffs;
- উত্তরাধিকার সূত্রে প্রাপ্ত শ্রেণিটি ব্যবহার করার চেষ্টা করবেন না যেখানে ভার্চুয়াল বেস (বিশেষত কব্জিটি নন-ভার্চুয়াল ডেস্ট্রাক্টর) আশা করা যায়। এটি ক্ষেত্রে সমস্যা হওয়া উচিত নয় - তবে এটি সম্পর্কে সচেতন হন
- আবার কোড পরিবর্তন হয়
- সম্ভাব্য নেমস্পেসের মিল নেই - এটি সমস্ত কীভাবে পয়েন্টার শ্রেণিটি শুরু করতে ব্যবহৃত হয় তার উপর নির্ভর করে
বিকল্প 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(); }
};
Tradeoffs;
- কিছুটা চরম যখন আপনি সত্যিই চান তা হ'ল বাস্তবায়নগুলি "বদলানো"
auto_ptr
স্কোপড (যথাstd::auto_ptr
) এর কি কোনও , তাদের কি দরকার হয় বা স্মার্ট পয়েন্টারটি অন্য কোনও নেমস্পেস থেকে নেওয়া যেতে পারে?