Ich habe das Gefühl, dass diese Frage schon einmal gestellt wurde, aber ich kann sie weder auf SO finden, noch finde ich etwas Nützliches auf Google. Vielleicht ist "kovariant" nicht das Wort, nach dem ich suche, aber dieses Konzept ist den kovarianten Rückgabetypen auf Funktionen sehr ähnlich, also denke ich, dass es wahrscheinlich richtig ist. Hier ist, was ich tun möchte, und es gibt mir einen Compiler-Fehler:C++ kovariante Vorlagen
class Base;
class Derived : public Base;
SmartPtr<Derived> d = new Derived;
SmartPtr<Base> b = d; // compiler error
Angenommen, diese Klassen sind voll konkretisiert ... Ich glaube, Sie bekommen die Idee. Es kann aus einem unklaren Grund keine SmartPtr<Derived>
in eine SmartPtr<Base>
konvertieren. Ich erinnere mich, dass das in C++ und vielen anderen Sprachen normal ist, obwohl ich mich im Moment nicht erinnern kann, warum.
Meine Wurzelfrage ist: Was ist der beste Weg, um diese Zuweisung durchzuführen? Zur Zeit ziehe ich den Zeiger aus dem SmartPtr
heraus, betone ihn explizit auf den Basistyp und verpacke ihn dann in einen neuen SmartPtr
des entsprechenden Typs (beachten Sie, dass dies keine Ressourcen verlustreich macht, da unsere selbstgewachsene Klasse SmartPtr
eine intrusive Referenz verwendet Zählen). Das ist lang und unordentlich, besonders wenn ich dann die SmartPtr
in ein anderes Objekt wickeln muss ... irgendwelche Abkürzungen?
Kommentare ausblenden @MSN: Ich habe durch Versuch und Irrtum gelernt, dass dies nicht ausreicht, um den "normalen" Kopierkonstruktor und Zuweisungsoperator zu erfüllen. Also müssen Sie beide implementieren: SmartPtr (const SmartPtr &) UND Vorlage SmartPtr (const SmartPtr &) (gleich für op =) –
mmmmmmmm
Nun ja, das ist was ich meinte :) – MSN
Ab C++ 11 Sie fügen auch move-constructor und move-assignment hinzu (diejenigen mit '&&'). –