Mam wrażenie, że wcześniej ktoś o to pytał, ale nie mogę go znaleźć na SO, ani nie mogę znaleźć niczego przydatnego w Google. Może "kowariancja" nie jest słowem, którego szukam, ale ta koncepcja jest bardzo podobna do kowariantnych typów zwrotów funkcji, więc myślę, że to prawdopodobnie jest poprawne. Oto, co chcę zrobić i to daje mi błąd kompilatora:Szablony covariant w C++
class Base;
class Derived : public Base;
SmartPtr<Derived> d = new Derived;
SmartPtr<Base> b = d; // compiler error
Przyjmijmy te zajęcia są w pełni uregulowana ... Myślę, że masz pomysł. Nie można przekonwertować wartości SmartPtr<Derived>
na SmartPtr<Base>
z jakiegoś niejasnego powodu. Pamiętam, że jest to normalne w C++ i wielu innych językach, choć w tej chwili nie pamiętam dlaczego.
Moje główne pytanie brzmi: jaki jest najlepszy sposób wykonania tej operacji przypisania? Obecnie wyciągam wskaźnik z SmartPtr
, wyraźnie upcasting go do typu podstawowego, a następnie owijając go w nowy SmartPtr
odpowiedniego typu (należy pamiętać, że nie jest to przeciekające zasoby, ponieważ nasza rodzima klasa SmartPtr
używa nachalnych odniesień rachunkowość). To długo i niechlujnie, zwłaszcza, gdy muszę następnie owinąć SmartPtr
w jeszcze jeden obiekt ... dowolne skróty?
ukryj komentarze @MSN: Nauczyłem się przez próbę i błąd, że to nie wystarcza do spełnienia "normalnego" konstruktora kopiowania i operatora przypisania. Musisz więc zaimplementować oba: SmartPtr (const SmartPtr &) I szablon SmartPtr (const SmartPtr &) (to samo dla op =) –
mmmmmmmm
No tak, właśnie o to mi chodziło :) – MSN
Od C++ 11 lat dodajesz również move-constructor i move-assignment (te z '&&'). –