Dalam sebagian besar hal std::unique_ptr
penggantian dilakukan untuk menjadi pengganti (tetapi lebih aman) std::auto_ptr
, sehingga harus ada sangat sedikit (jika ada) perubahan kode yang diperlukan selain (seperti yang Anda minta) mengarahkan kode untuk menggunakan salah satu unique_ptr
atau auto_ptr
.
Ada beberapa cara untuk melakukan ini (dan masing-masing dilengkapi dengan daftar pengorbanan sendiri) di bawah ini. Mengingat contoh kode yang diberikan, saya akan memilih salah satu dari dua opsi pertama .
Pilihan 1
#if __cplusplus >= 201103L
template <typename T>
using auto_ptr = std::unique_ptr<T>;
#else
using std::auto_ptr;
#endif
Pengorbanan;
- Anda memperkenalkan
auto_ptr
nama ke ruang nama global; Anda dapat mengurangi ini dengan mendefinisikannya sebagai namespace "pribadi" Anda sendiri
- Setelah bermigrasi ke C ++ 17 (saya percaya
auto_ptr
akan sepenuhnya dihapus), Anda dapat lebih mudah mencari dan mengganti
pilihan 2
template <typename T>
struct my_ptr {
#if __cplusplus >= 201103L
typedef std::unique_ptr<T> ptr;
#else
typedef std::auto_ptr<T> ptr;
#endif
};
Pengorbanan;
- Mungkin lebih rumit untuk dikerjakan, semua
auto_ptr
kebutuhan saat ini diubah dalam kode menjadi sepertimy_ptr<T>::ptr
- Keamanan yang lebih baik tidak diperkenalkan ke namespace global
Opsi 3
Agak kontroversial, tetapi jika Anda siap untuk menerima peringatan memiliki std
kelas sebagai basis
#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
Pengorbanan;
- Jangan mencoba menggunakan kelas yang diwariskan di mana basis virtual (khususnya wrt yang bukan-virtual destruktor) akan diharapkan. Bukan berarti ini harus menjadi masalah dalam kasus ini - tetapi sadari
- Sekali lagi, perubahan kode
- Ketidakcocokan namespace potensial - semuanya tergantung pada bagaimana kelas pointer digunakan untuk memulai
Opsi 4
Bungkus pointer dalam kelas baru dan agregasikan fungsi yang diperlukan untuk anggota
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(); }
};
Pengorbanan;
- Sedikit ekstrem ketika semua yang Anda inginkan adalah "menukar" implementasi keluar
auto_ptr
dicakup (yaitustd::auto_ptr
), apakah mereka perlu atau dapatkah smart pointer diperoleh dari beberapa namespace lain?