Apa metode terbaik untuk meneruskan sebuah shared_ptrdari tipe turunan ke fungsi yang mengambil shared_ptrtipe dasar?
Saya biasanya melewatkan shared_ptrreferensi untuk menghindari salinan yang tidak perlu:
int foo(const shared_ptr<bar>& ptr);
tetapi ini tidak berhasil jika saya mencoba melakukan sesuatu seperti
int foo(const shared_ptr<Base>& ptr);
...
shared_ptr<Derived> bar = make_shared<Derived>();
foo(bar);
Saya bisa menggunakan
foo(dynamic_pointer_cast<Base, Derived>(bar));
tetapi ini tampaknya kurang optimal karena dua alasan:
- A
dynamic_casttampaknya agak berlebihan untuk pemeran turunan-ke-dasar sederhana. - Seperti yang saya pahami,
dynamic_pointer_castmembuat salinan (meskipun sementara) dari pointer untuk diteruskan ke fungsi.
Apakah ada solusi yang lebih baik?
Pembaruan untuk anak cucu:
Ternyata itu adalah masalah file header yang hilang. Juga, apa yang saya coba lakukan di sini dianggap sebagai antipattern. Umumnya,
Fungsi yang tidak mempengaruhi masa pakai objek (yaitu, objek tetap valid selama durasi fungsi) harus menggunakan referensi atau penunjuk biasa, misalnya
int foo(bar& b).Fungsi yang mengkonsumsi suatu objek (yaitu pengguna akhir dari objek tertentu) harus mengambil
unique_ptrnilai, misalnyaint foo(unique_ptr<bar> b). Penelepon harusstd::movememasukkan nilai ke dalam fungsi.Fungsi yang memperpanjang umur suatu objek harus
shared_ptrberdasarkan nilai, misalnyaint foo(shared_ptr<bar> b). Nasihat biasa untuk menghindari referensi melingkar berlaku.
Lihat pembicaraan Kembali ke Dasar Herb Sutter untuk detailnya.
shared_ptr? Mengapa tidak ada referensi konstanta bar?