Übergeben von shared_ptr <Abgeleitet> als shared_ptr <Basis>
Was ist die beste Methode, um ashared_ptr
eines abgeleiteten Typs zu einer Funktion, die ashared_ptr
eines Basistyps?
Ich gehe im Allgemeinen vorbeishared_ptr
s durch Bezugnahme, um unnötige Kopien zu vermeiden:
int foo(const shared_ptr<bar>& ptr);
Aber das funktioniert nicht, wenn ich so etwas versuche
int foo(const shared_ptr<Base>& ptr);
...
shared_ptr<Derived> bar = make_shared<Derived>();
foo(bar);
ich könnte benutzen
foo(dynamic_pointer_cast<Base, Derived>(bar));
Dies scheint jedoch aus zwei Gründen nicht optimal zu sein:
Adynamic_cast
scheint ein bisschen übertrieben für eine einfache abgeleitete Besetzung.So wie ich es verstehe,dynamic_pointer_cast
Erstellt eine (wenn auch temporäre) Kopie des Zeigers, die an die Funktion übergeben wird.Gibt es eine bessere Lösung?
Update für die Nachwelt:Es stellte sich heraus, dass eine Header-Datei fehlt. Außerdem wird das, was ich hier versucht habe, als Antimuster angesehen. Allgemein,
Funktionen, die sich nicht auf die Lebensdauer eines Objekts auswirken (d. H. Das Objekt bleibt für die Dauer der Funktion gültig), sollten eine einfache Referenz oder einen Zeiger enthalten, z.int foo(bar& b)
.
Funktionen, dieverbrauchen ein Objekt (d. h. sind die Endbenutzer eines bestimmten Objekts) sollte aunique_ptr
nach Wert, z.B.int foo(unique_ptr<bar> b)
. Anrufer solltenstd::move
der Wert in die Funktion.
Funktionen, die die Lebensdauer eines Objekts verlängern, sollten eineshared_ptr
nach Wert, z.B.int foo(shared_ptr<bar> b)
. Die üblichen Ratschläge zu vermeidenZirkelverweise gilt.
Siehe Herb SuttersZurück zu den Grundlagen für Details.