Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah saya boleh menurunkan `unique_ptr` kepada `unique_ptr` dalam C ?

Bagaimanakah saya boleh menurunkan `unique_ptr` kepada `unique_ptr` dalam C ?

Mary-Kate Olsen
Lepaskan: 2024-11-21 19:30:16
asal
206 orang telah melayarinya

How can I safely downcast a `unique_ptr` to a `unique_ptr` in C  ?

Menurunkan unique_ptr to unique_ptr

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:

  • $texttt{static_unique_ptr_cast}$: Melakukan pemutus statik, dengan mengandaikan penuding mentah dijamin daripada jenis terbitan yang dikehendaki.
  • $texttt{dynamic_unique_ptr_cast}$: Melakukan penghantaran dinamik, menggunakan $texttt{dynamic_cast}$ untuk mengesahkan kesahihan pelakon.

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());
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan