2009-07-17 21 views
5

_com_ptr_ tiene un operador sobrecargado &() con un efecto secundario. Si tengo una variable:Si un operador está sobrecargado para una clase de C++, ¿cómo podría usar un operador predeterminado?

_com_ptr_t<Interface> variable; 

¿Cómo podría recuperar su dirección (_com_ptr_t <interfaz> * puntero) sin llamar al operador sobrecargado y provocando el efecto secundario?

+0

QUIERO que un '' _com_ptr_t * o un '' Interfaz usted *? – MSalters

+0

Quiero un _com_ptr_t <> *. – sharptooth

Respuesta

7

He visto este caso emergente en una reunión de ISO ya que rompió algunas implementaciones de macros offsetof() (LWG 273). La solución: &reinterpret_cast<unsigned char&>(variable)

+0

¿Podría esto alguna vez me pica en algún caso sorprendente? – sharptooth

+0

use boost :: address_of. Se basa en la implementación proporcionada en esta publicación. Creo que formará parte de la próxima norma. – ovanes

+0

@ sharptooth: Probablemente no. Esta solución tiene un comportamiento bastante razonable. Tomar la dirección de un valor de signo sin signo está perfectamente definido, y reinterpretar_cast a char sin firmar, y debería funcionar incluso si el objeto fundido define 'operador unsigned char'. – MSalters

0

& variable.GetInterfacePtr();

+1

Recupera la dirección del puntero almacenado en el puntero inteligente. Sin embargo, creo que la pregunta es acerca de cómo obtener la dirección del puntero inteligente. –

+0

Ah ... mi mal :( – Goz

3

que definen esta función de utilidad:

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