Ü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_ptrs 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:

A dynamic_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.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage