Если оператор перегружен для класса С++, как я могу вместо этого использовать оператор по умолчанию?

_com_ptr_ имеет перегруженный оператор&() с побочный эффект. Если у меня есть переменная:

_com_ptr_t<Interface> variable;

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


person sharptooth    schedule 17.07.2009    source источник
comment
Вы хотите _com_ptr_t<Interface>* или Interface* ?   -  person MSalters    schedule 17.07.2009


Ответы (3)


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

person MSalters    schedule 17.07.2009
comment
Может ли это когда-нибудь укусить меня в каком-то удивительном случае? - person sharptooth; 17.07.2009
comment
используйте boost::address_of. Он основан на реализации, представленной в этом посте. Думаю, это станет частью будущего стандарта. - person ovanes; 17.07.2009
comment
@sharptooth: Наверное, нет. Это решение имеет вполне разумное поведение. Взятие адреса unsigned char lvalue прекрасно определено, и reinterpret_cast to unsigned char& должен работать, даже если приведенный объект определяет сам operator unsigned char. - person MSalters; 17.07.2009

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

template<typename T>
T *GetRealAddr(T &t)
    { return reinterpret_cast<T*>(&reinterpret_cast<unsigned char &>(t)); }
person Daniel Earwicker    schedule 17.07.2009

&variable.GetInterfacePtr();

person Goz    schedule 17.07.2009
comment
Это извлекает адрес указателя, хранящегося в интеллектуальном указателе. Однако я думаю, что вопрос в том, как получить адрес умного указателя. - person Martin Liversage; 17.07.2009