Aggiornamento: shared_ptr in questo esempio è come quello in Boost, ma non supporta shared_polymorphic_downcast (o dynamic_pointer_cast o static_pointer_cast per quella materia)!
Sto cercando di inizializzare un puntatore condiviso a una classe derivata senza perdere il conteggio dei riferimenti:
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;
Fin qui tutto bene. Non mi aspettavo che C ++ convertisse implicitamente Base * in Derived *. Tuttavia, desidero la funzionalità espressa dal codice (ovvero, mantenere il conteggio dei riferimenti durante il downcast del puntatore di base). Il mio primo pensiero è stato quello di fornire un cast operator in Base in modo che potesse avvenire una conversione implicita in Derived (per i pedanti: controllerei che il down cast sia valido, non preoccuparti):
struct Base {
operator Derived* ();
}
// ...
Base::operator Derived* () {
return down_cast<Derived*>(this);
}
Beh, non ha aiutato. Sembra che il compilatore abbia completamente ignorato il mio operatore typecast. Qualche idea su come far funzionare l'assegnazione shared_ptr? Per punti extra: che tipo di tipo Base* const
è? const Base*
Capisco, ma Base* const
? A cosa si const
riferisce in questo caso?