2014-06-11 6 views
5

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?

+0

Aus der Zusammenfassung sehe ich keinen großen Unterschied zu einem 'weak_ptr'. Edit: Das Papier erwähnt nicht einmal "weak_ptrs" ... WTH ?? – RedX

+5

@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

+1

@RedX, 'weak_ptr' kann nicht für' unique_ptr' verwendet werden. – UniversE

Antwort

15

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.

+4

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

+1

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 xxx" und "xxx * xxx" gemischt sind. Andererseits bin ich vergesslich und möchte nicht jeden rohen Zeiger prüfen, ob er nach einigen Monaten sicher gelöscht/freigegeben werden soll und dann werde ich die Code-Segemente fast vollständig vergessen: D – UniversE

+2

@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

7

Ja: observer-ptr für C++ 98 auf GitHub.

+0

Martin Moene, danke :) Das ist ein sehr schöner Job. – UniversE

+0

Danke, das sollte die akzeptierte Antwort statt der augenzwinkernden akzeptierten "Antwort" sein. – Elizafox