2014-10-30 8 views
23

Ich habe eine Klasse, die unäre überladen hat. Die Objekte dieses Typs wurden mit new erstellt, daher war die Adresse der Variablen zugänglich, aber jetzt muss ich ein statisches Objekt verwenden. Ist es möglich, seine Adresse zu bekommen?C++ Adresse der Variablen ohne Operator erhalten

+1

Ist der * unary * 'Operator &' tatsächlich überlastet? –

+0

@FredLarson Ich war überrascht, auch zu sehen: http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Member_and_pointer_operators – KugBuBu

+0

@KugBuBu: Ja, ich sah, dass es überlastet werden kann. Aber die Frage ist nicht explizit, welche tatsächlich in diesem Fall überlastet ist. Ich habe gesehen, Klassen überladen binäre 'Operator &' (sagen wir, für String-Verkettung). Es ist ungewöhnlich, den unären Operator zu überlasten. –

Antwort

37

In C++ 11 oder höher verwenden, std::addressof(object), von den <memory> Header deklariert.

Historisch gesehen war es grotesker, vor allem, wenn Sie mit den Qualifiern const und volatile richtig umgehen wollten. Eine Möglichkeit, die von Boost-Implementierung von addressof ist

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

erste qualifers Zugabe während zu char& Umwandlung, so dass reinterpret_cast funktionieren würde, aber object qualifiziert waren; dann entfernen sie, so dass die endgültige Umwandlung funktionieren würde; Dann nehme ich die Adresse und wandle diese in den richtigen Typ um. Solange T dieselben Qualifikationsmerkmale wie object hat (was als Vorlagenparameter von object abgeleitet wird), wird der resultierende Zeiger korrekt qualifiziert.

+8

Dies ist auch, wie 'std :: addressof' von GCC implementiert wird – Brian

+1

Und so ziemlich die gleiche Implementierung für VC++. – Niall

Verwandte Themen