2009-07-17 6 views
5

_com_ptr_ a un opérateur surchargé &() avec un effet secondaire. Si j'ai une variable:Si un opérateur est surchargé pour une classe C++, comment utiliser un opérateur par défaut?

_com_ptr_t<Interface> variable; 

Comment pourrais-je récupérer son adresse (_com_ptr_t <Interface> * pointeur) sans appeler l'opérateur surchargé et le déclenchement de l'effet secondaire?

+0

Voulez-vous un '' _com_ptr_t * ou '' Interface *? – MSalters

+0

Je veux un _com_ptr_t <> *. – sharptooth

Répondre

7

J'ai vu ce cas surgir dans une réunion ISO car il a cassé quelques implémentations de macro offsetof() LWG 273). La solution: &reinterpret_cast<unsigned char&>(variable)

+0

Serait-ce jamais mordre dans un cas surprenant? – sharptooth

+0

utiliser boost :: address_of.Il est basé sur la mise en œuvre prévue dans ce post.Je pense que ce sera une partie de la norme à venir – ovanes

+0

@ sharptooth: Probablement pas Cette solution a un comportement tout à fait raisonnable Prendre l'adresse d'une char lvalue non signée est parfaitement bien définie, et reinterpret_cast en char non signé et devrait fonctionner même si l'objet casted définit lui-même l'opérateur unsigned char. – MSalters

0

& variable.GetInterfacePtr();

+1

Récupère l'adresse du pointeur stocké dans le pointeur intelligent. Cependant, je pense que la question est sur la façon d'obtenir l'adresse du pointeur intelligent. –

+0

Ah ... mon mauvais :( – Goz

3

Je définir cette fonction d'utilité:

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