Güncelleme: Bu örnekteki shared_ptr, Boost'takine benzer, ancak shared_polymorphic_downcast'i (veya bu konuda dynamic_pointer_cast veya static_pointer_cast'i) desteklemez!
Referans sayısını kaybetmeden türetilmiş bir sınıfa paylaşılan bir işaretçi başlatmaya çalışıyorum:
struct Base { };
struct Derived : public Base { };
shared_ptr<Base> base(new Base());
shared_ptr<Derived> derived;
// error: invalid conversion from 'Base* const' to 'Derived*'
derived = base;
Çok uzak çok iyi. C ++ 'nın Base *' i dolaylı olarak Derived * 'e dönüştürmesini beklemiyordum. Bununla birlikte, kod tarafından ifade edilen işlevselliği istiyorum (yani, temel işaretçiyi aşağıya doğru çevirirken referans sayımını sürdürmek). İlk düşüncem, Derived'e örtük bir dönüşümün gerçekleşebilmesi için Base'de bir döküm operatörü sağlamaktı (bilgiçler için: Aşağı atmanın geçerli olup olmadığını kontrol ederdim, endişelenmeyin):
struct Base {
operator Derived* ();
}
// ...
Base::operator Derived* () {
return down_cast<Derived*>(this);
}
Pek yardımcı olmadı. Görünüşe göre derleyici typecast operatörümü tamamen görmezden geldi. Shared_ptr atamasını nasıl çalıştırabileceğime dair bir fikriniz var mı? Ekstra puan için: ne tür bir tür Base* const
? const Base*
Anlıyorum ama Base* const
? const
Bu durumda neyi ifade eder?