Was ist die beste Methode, um shared_ptr
einen abgeleiteten Typ an eine Funktion zu übergeben, die shared_ptr
einen Basistyp verwendet?
Ich übergebe im Allgemeinen shared_ptr
s als Referenz, um eine unnötige Kopie zu vermeiden:
int foo(const shared_ptr<bar>& ptr);
aber das funktioniert nicht, wenn ich versuche, so etwas zu tun
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:
- A
dynamic_cast
scheint für eine einfache Ableitung von der Basis zur Basis etwas übertrieben zu sein. - So wie ich es verstehe,
dynamic_pointer_cast
wird eine Kopie (wenn auch eine temporäre) des Zeigers erstellt, 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 fehlte. Auch was ich hier versucht habe, wird als Antimuster angesehen. Allgemein,
Funktionen, die sich nicht auf die Lebensdauer eines Objekts auswirken (dh das Objekt bleibt für die Dauer der Funktion gültig), sollten eine einfache Referenz oder einen Zeiger verwenden, z
int foo(bar& b)
.Funktionen, die ein Objekt verbrauchen (dh die Endbenutzer eines bestimmten Objekts sind), sollten einen
unique_ptr
By-Wert annehmen , zint foo(unique_ptr<bar> b)
. Anrufer solltenstd::move
den Wert in die Funktion einfließen lassen .Funktionen, die die Lebensdauer eines Objekts verlängern, sollten einen
shared_ptr
By-Wert annehmen , zint foo(shared_ptr<bar> b)
. Die übliche Beratung zu vermeiden zirkuläre Referenzen gilt.
Weitere Informationen finden Sie im Back to Basics-Vortrag von Herb Sutter .
shared_ptr
? Warum keine konstante Referenz von bar?