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
222 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!

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