2009-07-17 2 views
5

_com_ptr_ имеет перегруженный оператор &() с побочным эффектом. Если у меня есть переменный:Если оператор перегружен для класса C++, как я могу использовать оператор по умолчанию?

_com_ptr_t<Interface> variable; 

Как я могу получить свой адрес (_com_ptr_t < интерфейса > * указатель) без вызова перегруженного оператора и вызывают побочный эффект?

+0

ли хотите, '_com_ptr_t *' или 'Interface вы *'? – MSalters

+0

Я хочу _com_ptr_t <> *. – sharptooth

ответ

7

Я видел, что этот случай появился на собрании ISO, поскольку он нарушил некоторые реализации макросов offsetof() (LWG 273). Решение: &reinterpret_cast<unsigned char&>(variable)

+0

Может ли это когда-нибудь укусить меня в каком-нибудь неожиданном случае? – sharptooth

+0

use boost :: address_of. Он основан на реализации, предоставленной в этом посте. Я думаю, что это будет частью предстоящего стандарта. – ovanes

+0

@ sharptooth: Вероятно, нет. Это решение имеет вполне разумное поведение. Определение адреса unsigned char lvalue отлично определено, а reinterpret_cast - беззнаковому char & должно работать, даже если casted object определяет 'operator unsigned char' сам. – MSalters

0

& переменная.GetInterfacePtr();

+1

Это извлекает адрес указателя, хранящегося в интеллектуальном указателе. Однако, я думаю, вопрос заключается в том, как получить адрес смарт-указателя. –

+0

Ah ... my bad :( – Goz

3

Я определяю эту функцию полезности:

template<typename T> 
T *GetRealAddr(T &t) 
    { return reinterpret_cast<T*>(&reinterpret_cast<unsigned char &>(t)); } 
Смежные вопросы