Alternativen static_pointer_cast für unique_ptr

Ich verstehen, dass die Verwendung static_pointer_cast mit unique_ptr würde dazu führen, dass eine gemeinsame Verantwortung, die darin enthaltenen Daten.
In anderen Worten, was ich tun möchte ist:

unique_ptr<Base> foo = fooFactory();
//do something for a while
unique_ptr<Derived> bar = static_unique_pointer_cast<Derived>(foo);

Sowieso tun, dass die Ergebnisse mit zwei unique_ptr sollten nie zur gleichen Zeit existieren, so ist es einfach verboten.
Recht, es macht Sinn, absolut, das ist, warum es existiert nicht so etwas wie static_unique_pointer_cast in der Tat.

So weit, in Fällen, in denen ich speichern möchte Zeigern auf die Basisklasse, aber ich brauche, um Sie zu werfen, um einige abgeleitete Klassen (als ein Beispiel vorstellen, ein Szenario mit type erasure), die ich benutzt habe shared_ptrs denn, was habe ich oben erwähnt.

Jedenfalls war ich zu erraten, ob es alternativen zu shared_ptrs für so ein problem ist oder ob das wirklich die beste Lösung in diesem Fall.

static_pointer_cast ist nur definiert für das argument type std::shared_ptr<T> - es ist nicht verwendbar bei allen mit unique_ptr
Ja, ich weiß, ich schrieb fast das gleiche in der Frage zu sagen, das nicht existiert, eine Entsprechung für die unique_ptr.
Warum type-erasure führen zu downcasting? Wenn Sie brauchen, um werfen Sie Ihre base-Klasse in einen abgeleiteten Typ ist, ist es am häufigsten, mit Ausnahme von sehr wenigen Fällen, eine design-Frage, die gelöst werden sollten, unterschiedlich.
Stellen Sie sich struct B { virtual void f() = 0; }; template<class T> struct D: public B { void f() override { /* do something with D */ } }; haben Sie jemals etwas getan? Mit der guten Mischung aus Wrapper und static_pointer_cast Sie können eine Menge interessante Dinge.
Naja, ich würd sagen, dass die anderen Antworten haben einen direkten und sauberen Ansatz, aber... es funktioniert... das ist es. 🙂

InformationsquelleAutor skypjack | 2016-03-20

Schreibe einen Kommentar