Apa metode terbaik untuk meneruskan sebuah shared_ptr
dari tipe turunan ke fungsi yang mengambil shared_ptr
tipe dasar?
Saya biasanya melewatkan shared_ptr
referensi 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_cast
tampaknya agak berlebihan untuk pemeran turunan-ke-dasar sederhana. - Seperti yang saya pahami,
dynamic_pointer_cast
membuat 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_ptr
nilai, misalnyaint foo(unique_ptr<bar> b)
. Penelepon harusstd::move
memasukkan nilai ke dalam fungsi.Fungsi yang memperpanjang umur suatu objek harus
shared_ptr
berdasarkan 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?