Kami sedang menguji perpustakaan di bawah C ++ 11 (yaitu, -std=c++11
). Perpustakaan menggunakan auto_ptr
dan pola ini:
Foo* GetFoo()
{
autoptr<Foo> ptr(new Foo);
// Initialize Foo
ptr->Initialize(...);
// Now configure remaining attributes
ptr->SomeSetting(...);
return ptr.release();
}
C ++ 11 sudah usang auto_ptr
, jadi kami ingin menjauh darinya.
Namun, kode ini mendukung C ++ 03 dan C ++ 11, jadi tidak sesederhana menarik auto_ptr
. Perlu juga disebutkan bahwa perpustakaan tidak memiliki dependensi eksternal. Ini menggunakan C ++ 03; dan tidak menggunakan Autotools, Cmake, Boost, ...
Bagaimana seharusnya kita menangani perubahan desain untuk menjauh dari auto_ptr
C ++ 11 sambil mempertahankan kompatibilitas dengan C ++ 03?
auto_ptr
dicakup (yaitustd::auto_ptr
), apakah mereka perlu atau dapatkah smart pointer diperoleh dari beberapa namespace lain?Foo::Initialize
ke dalamFoo::Foo
.Jawaban:
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 satuunique_ptr
atauauto_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
Pengorbanan;
auto_ptr
nama ke ruang nama global; Anda dapat mengurangi ini dengan mendefinisikannya sebagai namespace "pribadi" Anda sendiriauto_ptr
akan sepenuhnya dihapus), Anda dapat lebih mudah mencari dan menggantipilihan 2
Pengorbanan;
auto_ptr
kebutuhan saat ini diubah dalam kode menjadi sepertimy_ptr<T>::ptr
Opsi 3
Agak kontroversial, tetapi jika Anda siap untuk menerima peringatan memiliki
std
kelas sebagai basisPengorbanan;
Opsi 4
Bungkus pointer dalam kelas baru dan agregasikan fungsi yang diperlukan untuk anggota
Pengorbanan;
sumber
tr1
namespace no lagi di sana (saya menggunakan libc ++ dan bukan libstdc ++). Saya tahu tr1 adalah non-normatif, tetapi saya tidak dapat menemukan di mana pun dalam konsep (di sini) bahwa file harus<tr1/...>
sama sekali, infact itu menyebutkan hanya berada di header<memory>
dll file hanya ditr1
namespace.CXX=...
).c++ -v -std=c++11 -x c++ - < /dev/null
. Sayagrep'd
menyertakan direktori yang dibuang, dan mereka tidak termasukunique_ptr
.Opsi 5: Alias langsung.
Pengorbanan:
Untuk versi bahasa yang lebih baru, AKA C ++ 11 dan yang lebih baru, alias Anda ketik memetakan ke smart pointer yang benar. Kode pengguna apa pun yang sebenarnya bergantung pada API khusus untuk std :: auto_ptr akan ditandai oleh kompiler, yang merupakan jaminan utama bahwa itu akan benar-benar diperbaiki.
Dalam mode Legacy c ++ 03 jenis alias adalah makro. Ini kasar, tetapi sintaks yang dihasilkan
MyPtr<T>
akan identik dengan kasus C ++ 11 sepanjang sisa kode.Anda harus menemukan dan mengubah semua variabel auto_ptr Anda
MyPtr
untuk mengaturnya.sumber