Ich möchte observer_ptr
in meinem Projekt verwenden, aber die paper definiert nur die Schnittstelle, nicht die vollständige Implementierung. Gibt es jetzt eine Open-Source-Implementierung, oder muss ich das selbst machen?Gibt es jetzt eine Implementierung für observer_ptr?
Antwort
Sie können die so genannte observer_ptr
trivial erstellen, indem Sie eine unique_ptr
mit einem NOP Deleter erstellen.
template<typename T>
struct nop_deleter
{
void operator()(T*) const {}
};
template<typename T>
using observer_ptr = unique_ptr<T, nop_deleter>;
Dies wird noch unique_ptr
‚s Verhalten haben, ist es bewegen-only bedeutet, während Sie observer_ptr
kopierbar sein wollen würde. Was uns zu einer einfacheren Implementierung führt:
template<typename T>
using observer_ptr = T*;
Das macht alles was Sie wollen. Man kann es observer_ptr<int>
anstelle von int *
nennen, weil Letzteres natürlich böse ist. Es ist kopierbar und tut nichts zur Zerstörung.
ich sein oben in der Antwort facetious, aber hoffentlich wird es zeigen, dass observer_ptr
nicht viel anderes Dienstprogramm hat einen anderen Namen als ein Rohzeiger Typ als mit. Es gibt nichts falsch bei der Verwendung eines nicht besitzenden rohen Zeigers.
Sie können argumentieren, dass observer_ptr
Absicht übermittelt, aber dieses Argument ist nur gültig, wenn Ihre Codebasis Instanzen von rohen Zeigern enthält, die Ressourcen verwalten. Beseitigen Sie diese und ein roher Zeiger bedeutet automatisch observer_ptr
... ohne den Namen.
Wenn Sie unbedingt den Phantasienamen haben muss, und/oder einen bestimmten Typ, deren Umsetzung sollte sich einfach sein.
Ich nehme an, eine der erforderlichen Funktionen von observer_ptr ist seine Schnittstelle kompatibel mit anderen Standard-Smart-Pointer (mit Methoden wie Reset, Swap, Get, wahrscheinlich Release) – lisyarus
Vielen Dank :) Ihre Umsetzung ist elegant und Ihr Gedankengang ist erstaunlich ! Ich glaube nicht, rohe Pointers zu benutzen ist böse. Vermeide und benutze sie nur wenn es sein muss, denn das sieht chaotisch aus wenn "unique_ptr
@lisyarus Ja, die Schnittstelle stimmt mit den anderen intelligenten Zeigern überein, und vielleicht gibt es Gelegenheiten, wenn Sie das brauchen. Aber ich bin noch nicht auf die Notwendigkeit gestoßen, generisch auf einem intelligenten Zeigertyp zu operieren, ohne die Besitz-Semantik im Spiel zu kennen. Aber ich bin mir sicher, dass ein erfundenes Beispiel vorbereitet werden kann, wo dies nützlich wäre. In Wirklichkeit wäre der Nutzen jedoch eher begrenzt. – Praetorian
Ja: observer-ptr für C++ 98 auf GitHub.
Aus der Zusammenfassung sehe ich keinen großen Unterschied zu einem 'weak_ptr'. Edit: Das Papier erwähnt nicht einmal "weak_ptrs" ... WTH ?? – RedX
@RedX: weak_ptr benötigt einen zugewiesenen freigegebenen Status und kann nur verwendet werden, wenn das Objekt einem shared_ptr gehört. Die Semantik und Nutzung scheint also ganz anders zu sein. – lisyarus
@RedX, 'weak_ptr' kann nicht für' unique_ptr' verwendet werden. – UniversE