2009-07-17 3 views
5

_com_ptr_ hat einen überladenen Operator &() mit einem Nebeneffekt. Wenn ich eine Variable:Wenn ein Operator für eine C++ - Klasse überladen wird, wie könnte ich stattdessen einen Standardoperator verwenden?

_com_ptr_t<Interface> variable; 

Wie konnte ich abrufen seine Adresse (_com_ptr_t <Schnittstelle> * Zeiger), ohne den überladenen Operator aufrufen und die Auslösung der Nebenwirkung?

+0

Wollen Sie eine '_com_ptr_t *' oder einer 'Schnittstelle *'? – MSalters

+0

Ich möchte ein _com_ptr_t <> *. – sharptooth

Antwort

7

Ich habe gesehen, dass dieser Fall in einer ISO-Besprechung auftaucht, da er einige offsetof() -Makroimplementierungen (LWG 273) zerstört hat. Die Lösung: &reinterpret_cast<unsigned char&>(variable)

+0

Könnte mich das in irgendeinem überraschenden Fall beißen? – sharptooth

+0

Verwenden Sie boost :: address_of. Es basiert auf der Implementierung, die in diesem Beitrag zur Verfügung gestellt wird. Ich denke, dass es ein Teil des kommenden Standards sein wird. – ovanes

+0

@ sharptooth: Wahrscheinlich nicht Diese Lösung hat ein recht vernünftiges Verhalten Die Adresse eines unsignierten Zeichenwerts zu nehmen ist vollkommen klar definiert und sollte zu unsigniertem Zeichen uminterpretiert werden, sollte auch dann funktionieren, wenn das gegossene Objekt selbst den Operator unsigned char definiert. – MSalters

0

& variable.GetInterfacePtr();

+1

Dies ruft die Adresse des im Smartpointer gespeicherten Zeigers ab. Ich denke jedoch, dass die Frage darin besteht, wie man die Adresse des intelligenten Zeigers erhält. –

+0

Ah ... mein Schlechter :( – Goz

3

Ich definiere diese Nutzenfunktion:

template<typename T> 
T *GetRealAddr(T &t) 
    { return reinterpret_cast<T*>(&reinterpret_cast<unsigned char &>(t)); } 
Verwandte Themen