ในการเคารพมากที่สุด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
ชื่อลงใน namespace ส่วนกลาง คุณสามารถลดสิ่งนี้ได้โดยกำหนดเป็นเนมสเปซ "ส่วนตัว" ของคุณเอง
- เมื่อย้ายไปที่ 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
- ความปลอดภัยที่ดีขึ้นชื่อจะไม่ถูกนำเข้าสู่ namespace ทั่วโลก
ตัวเลือก 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
สมดุล;
- อย่าพยายามใช้คลาสที่สืบทอดมาซึ่งฐานเสมือน (โดยเฉพาะ wrt ตัวทำลายระบบเสมือน) จะต้องถูกคาดหวัง ไม่ใช่ว่านี่ควรจะเป็นปัญหาในกรณี - แต่ระวังให้ดี
- การเปลี่ยนแปลงรหัสอีกครั้ง
- ศักยภาพเนมสเปซที่ไม่ตรงกัน - ขึ้นอยู่กับวิธีการใช้คลาสพอยน์เตอร์เริ่มต้นด้วย
ตัวเลือก 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
) พวกเขาจำเป็นต้องเป็นหรือสามารถรับตัวชี้สมาร์ทได้จาก namespace อื่น ๆ ?