Использование &
для получения адреса переменной может быть проблематичным, если тип переменной перегружен operator&()
.Например, _com_ptr_ перегружен operator&()
с побочным эффектом изменения объекта.
Теперь у меня есть сложный набор шаблонов с такими функциями:
template<class T>
void process( const T* object )
{
//whatever
}
template<class T>
void tryProcess( T& object )
{
process( &object )
}
В tryProcess()
Мне нужно получить указатель T*
, содержащий адрес фактического объекта типа T
.
Вышеприведенная реализация tryProcess()
будет работать нормально, только если class T
неoperator&()
перегружен.Поэтому, если я позвоню tryProcess<_com_ptr_<Interface>>()
, я могу получить неожиданные результаты - перегруженный operator&()
срабатывает.
В другой вопрос следующий обходной путь предлагается :
template<class T>
T* getAddress( T& object )
{
return reinterpret_cast<T*>( &reinterpret_cast<char&>( object ) );
}
С помощью такой функции я могу реализовать tryProcess()
следующим образом:
template<class T>
void tryProcess( T& object )
{
process( getAddress( object ) )
}
и всегда получу одинаковое поведение независимо от того, перегружен ли class T
operator&()
.Это обеспечивает нулевые накладные расходы с оптимизацией в Visual C ++ 7 - компилятор получает то, что нужно сделать, и просто получает адрес объекта.
Насколько переносимым и стандартно-компилируемым является это решение проблемы?Как это можно улучшить?