shared_ptrTüretilmiş türden a'yı shared_ptrtemel türden alan bir işleve geçirmenin en iyi yöntemi nedir ?
shared_ptrGereksiz 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_ptrdeğ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_ptrdeğ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?