2014-06-11 14 views
5

Mi piacerebbe usare observer_ptr nel mio progetto, ma lo paper definisce solo l'interfaccia, non l'implementazione completa. Esiste un'implementazione open source ora o devo farlo da solo?Esiste un'implementazione per observer_ptr adesso?

+0

Dall'astratto non vedo molta differenza per un 'weak_ptr'. Modifica: la carta non menziona nemmeno 'weak_ptrs' ... WTH ?? – RedX

+5

@RedX: weak_ptr richiede uno stato condiviso allocato e non sarà utilizzabile a meno che l'oggetto non sia di proprietà di shared_ptr. Quindi, la semantica e l'uso sembrano abbastanza diversi. – lisyarus

+1

@RedX, 'weak_ptr' non può essere utilizzato su' unique_ptr'. – UniversE

risposta

15

È possibile creare banalmente il cosiddetto observer_ptr creando un unique_ptr con un deleter NOP.

template<typename T> 
struct nop_deleter 
{ 
    void operator()(T*) const {} 
}; 

template<typename T> 
using observer_ptr = unique_ptr<T, nop_deleter>; 

Questo avrà ancora unique_ptr 's comportamento, che significa che è muoversi solo, mentre si vorrebbe observer_ptr essere copiabile. Il che ci porta ad un'implementazione più semplice:

template<typename T> 
using observer_ptr = T*; 

Questo fa tutto ciò che vuoi. Puoi chiamarlo observer_ptr<int> invece di int *, perché quest'ultimo è, ovviamente, malvagio. È copiabile e non fa nulla alla distruzione.


che sto essendo faceto nella risposta di cui sopra, ma si spera, sarà dimostrare che observer_ptr non ha molto di utilità oltre ad avere un nome diverso da un tipo di puntatore crudo. C'è niente di sbagliato nell'usare un puntatore raw non proprietario.

È possibile affermare che observer_ptr trasmette l'intento, ma tale argomento è valido solo se il codice di base contiene istanze di puntatori non elaborati che gestiscono le risorse. Eliminare quelli e quindi un puntatore crudo significherà automaticamente observer_ptr ... senza il nome di fantasia.


Se è assolutamente necessario il nome di fantasia e/o un tipo distinto, implementarlo manualmente dovrebbe essere semplice.

+4

Suppongo che una delle funzionalità richieste di observer_ptr sia la sua interfaccia compatibile con altri puntatori intelligenti standard (con metodi come reset, swap, get, probabilmente release) – lisyarus

+1

Grazie mille :) La tua implementazione è elegante e il tuo pensiero è incredibile ! Non penso che l'uso di appuntamenti grezzi sia malvagio. Evita e usali solo quando è necessario perché sembra caos quando "unique_ptr xxx" e "xxx * xxx" sono mescolati. D'altra parte, sono smemorato e non voglio controllare ogni puntatore crudo se dovrebbe essere cancellato/liberato in modo sicuro dopo alcuni mesi e poi mi dimenticherò quasi del tutto il codice: D – UniversE

+2

@lisyarus Sì, l'interfaccia è coerente con gli altri puntatori intelligenti, e forse ci sono occasioni in cui ne hai bisogno. Ma non ho ancora incontrato la necessità di operare genericamente su un tipo di puntatore intelligente senza la conoscenza della semantica della proprietà in gioco. Ma sono sicuro che un esempio forzato può essere cucinato dove ciò sarebbe utile. Tuttavia, in realtà, l'utilità sarebbe piuttosto limitata. – Praetorian

7

Sì: observer-ptr per C++ 98 in poi su GitHub.

+0

Martin Moene, grazie :) Questo è un ottimo lavoro. – UniversE

+0

Grazie, questa è la risposta accettata al posto della "risposta" accettata. – Elizafox