Pengenalan:
Dalam pengaturcaraan $texttt{C }$, kita mungkin menghadapi senario di mana kita perlu menukar atau "menundukkan" $texttt {unique_ptr}$ daripada kelas asas $texttt{Base}$ hingga a $texttt{unique_ptr}$ daripada kelas terbitan $texttt{Derived}$. Proses ini melibatkan penghantaran penuding mentah yang disimpan dalam $texttt{unique_ptr}$ kepada jenis terbitan yang diingini sambil mengekalkan semantik pemilikan.
Penghantaran melalui Pelepasan dan Penetapan Semula:
Soalan mencadangkan kaedah untuk melepaskan objek daripada $texttt{unique_ptr}$ dan kemudian menghantar mentah penunjuk kepada jenis terbitan yang dikehendaki. Pendekatan ini sah dari segi konsep, tetapi ia mempunyai potensi kelemahan: jangka hayat objek diuruskan seketika oleh penunjuk mentah, yang boleh menyebabkan kebocoran memori jika pemanggil gagal mengendalikan $texttt{unique_ptr}$ dengan betul selepas itu.
Alternatif: Hantaran Penunjuk Unik Statik dan Dinamik:
Untuk menangani perkara ini isu, kita boleh memanfaatkan templat fungsi berikut:
Pelaksanaan:
template<typename Derived, typename Base, typename Del> std::unique_ptr<Derived, Del> static_unique_ptr_cast(std::unique_ptr<Base, Del>&& p) { auto d = static_cast<Derived *>(p.release()); return std::unique_ptr<Derived, Del>(d, std::move(p.get_deleter())); } template<typename Derived, typename Base, typename Del> std::unique_ptr<Derived, Del> dynamic_unique_ptr_cast(std::unique_ptr<Base, Del>&& p) { if (Derived *result = dynamic_cast<Derived *>(p.get())) { p.release(); return std::unique_ptr<Derived, Del>(result, std::move(p.get_deleter())); } return std::unique_ptr<Derived, Del>(nullptr, p.get_deleter()); }
Penggunaan:
Gunakan $texttt{ static_unique_ptr_cast}$ apabila anda pasti tentang jenis terbitan. Jika tidak, gunakan $texttt{dynamic_unique_ptr_cast}$ untuk menyemak jenis yang betul semasa masa jalan. Fungsi ini menggunakan rujukan nilai untuk mengelakkan pengubahsuaian yang tidak disengajakan pada $texttt{unique_ptr}$ yang asal.
Atas ialah kandungan terperinci Bagaimanakah saya boleh menurunkan `unique_ptr` kepada `unique_ptr` dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!