shared_ptr
Türetilmiş türden a'yı shared_ptr
temel türden alan bir işleve geçirmenin en iyi yöntemi nedir ?
shared_ptr
Gereksiz bir kopyadan kaçınmak için genellikle s'yi referans olarak geçiririm:
int foo(const shared_ptr<bar>& ptr);
ama böyle bir şey yapmaya çalışırsam bu işe yaramaz
int foo(const shared_ptr<Base>& ptr);
...
shared_ptr<Derived> bar = make_shared<Derived>();
foo(bar);
kullanabilirim
foo(dynamic_pointer_cast<Base, Derived>(bar));
ancak bu, iki nedenden dolayı optimalin altında görünüyor:
- A
dynamic_cast
, basit bir türetilmiş tabana döküm için biraz aşırı görünüyor. - Anladığım kadarıyla
dynamic_pointer_cast
, işleve geçmek için işaretçinin (geçici de olsa) bir kopyasını oluşturuyor.
Daha iyi bir çözüm var mı?
Gelecek nesil için güncelleme:
Eksik bir başlık dosyası sorunu olduğu ortaya çıktı. Ayrıca, burada yapmaya çalıştığım şey bir anti-model olarak kabul ediliyor. Genel olarak,
Bir nesnenin yaşam süresini etkilemeyen işlevler (yani nesne, işlevin süresi boyunca geçerli kalır) düz bir referans veya işaretçi almalıdır, ör
int foo(bar& b)
.Bir nesneyi tüketen işlevler (yani belirli bir nesnenin son kullanıcılarıdır) bir
unique_ptr
değer almalıdır , örint foo(unique_ptr<bar> b)
. Arayanlarstd::move
, işleve değer girmelidir .Bir nesnenin ömrünü uzatan işlevler bir
shared_ptr
değer almalıdır , örnint foo(shared_ptr<bar> b)
. Döngüsel referanslardan kaçınmak için olağan tavsiyeler geçerlidir.
Ayrıntılar için Herb Sutter's Back to Basics konuşmasına bakın.
shared_ptr
? Neden sabit referansı yok?