2014-10-30 13 views
23

Ho una classe che ha sovraccaricato unario operator&. Gli oggetti di quel tipo sono stati creati usando new, quindi l'indirizzo della variabile era accessibile ma ora ho bisogno di usare l'oggetto statico. È possibile ottenere il suo indirizzo?C++ ottenere l'indirizzo della variabile senza operatore e

+1

L'operatore * unary * 'e 'in effetti sovraccarico? –

+0

@FredLarson Sono stato anche sorpreso: http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Member_and_pointer_operators – KugBuBu

+0

@KugBuBu: Sì, ho visto che può essere sovraccaricato. Ma la domanda non è esplicita su cui in realtà è sovraccaricato in questo caso. Ho visto le classi sovraccaricare l'operatore 'binario '(per esempio, per la concatenazione delle stringhe). È insolito sovraccaricare l'operatore unario. –

risposta

37

In C++ 11 o successivo, std::addressof(object), dichiarato dal intestazione <memory>.

Storicamente, era più grottesco, soprattutto se si desidera gestire correttamente i qualificatori const e volatile. Una possibilità mediante la realizzazione di Boost di addressof è

reinterpret_cast<T*>(
    &const_cast<char&>(
     reinterpret_cast<const volatile char &>(object))) 

aggiungendo prima qualifers durante la conversione a char& modo che reinterpret_cast funzionerebbe comunque object erano qualificato; quindi rimuovendoli in modo che la conversione finale funzionasse; poi finalmente prendendo l'indirizzo e convertendolo nel tipo corretto. Finché T ha le stesse qualificazioni di object (che sarà come un parametro del modello dedotto da object), il puntatore risultante sarà qualificato correttamente.

+8

Questo è anche il modo in cui 'std :: addressof' è implementato da GCC – Brian

+1

E praticamente la stessa implementazione per VC++. – Niall