Esiste una classe puntatore standard (o Boost) che è un puntatore non condiviso che funziona con tipi incompleti? Ho esaminato lo standard C++ 11 e la libreria boost e non riesco a trovarne uno, anche se sembra un tipo molto utile.Un puntatore intelligente non condiviso con tipi incompleti
Per esempio, mi piacerebbe essere in grado di fare tipi opachi usando un puntatore intelligente.
class A;
wrap_ptr<A> some_func();
void other_func(A const &);
A
è un tipo opaco che può essere utilizzato per una varietà di funzioni. L'utente dell'interfaccia precedente ha solo una definizione incompleta di A, ma dovrebbe essere in grado di cancellare/ripristinare il puntatore. So che quanto sopra può essere fatto con un shared_ptr
ma che ha un overhead che non voglio in questo particolare codice. unique_ptr
ha la semantica della proprietà corretta, ma non può funzionare con un tipo incompleto. In teoria un wrapper dovrebbe avere solo l'overhead di avere un puntatore a un deleter.
Esiste un tipo in C++ 11 o nelle librerie di boost?
NOTA: Capisco che posso facilmente creare questo tipo, ma preferirei un tipo standard se possibile. Sembra che dovrebbe essere un tipo di puntatore intelligente fondamentale.
UPDATE: unique_ptr
non sembra essere una buona opzione. Prima di tutto, l'overhead della sintassi si compenserebbe. In secondo luogo non sono convinto che possa essere tranquillamente utilizzato con un deleter personalizzato. Controllerò per vedere come potrebbe funzionare.
Mentre tecnicamente vero, l'uso diretto di questo è sintatticamente ostile. Non si può semplicemente fare 'ptr_type (new T)' ma, assumendo si ottiene il typedef template corretto, si deve fare 'ptr_type (new T, T :: ~ T)'. –
In realtà, guardando da vicino 'unique_ptr' non è possibile usare un deleter personalizzato con uno stato. La funzione 'reset' non consente di specificare un deleter, solo il costruttore lo fa, quindi l'aspetto dell'eliminazione personalizzata di' unique_ptr' è parzialmente rotto. –
Non è necessario alcun deleter personalizzato, il tipo deve essere completato solo quando viene richiamato il distruttore di 'unique_ptr', il che significa che è possibile definire il distruttore dopo che la classe contenuta è stata completata. – Xeo