Здравствуйте, Red Line, Вы писали:
RL>Меня тормозят следующие моменты:
Рассмотрим интерфейс ISome и смарт-птр к нему, CComPtr<ISome> == CSomePtr;
RL>// Преобразование
RL>operator T*() { return m_pI; }
CSomePtr ptr;
void foo(ISome* p);
ISome* p = ptr;
foo(ptr);
RL>// Операции с указателем
RL>T& operator*() { assert(m_pI != NULL); return *m_pI; }
// эквивалентные способы вызвать метод: оператор-> и разыменовать...
((ISome*)ptr)->method();
(*((ISome*)ptr)).method();
(*ptr).method();
RL>T** operator&() { assert(m_pI == NULL); return &m_pI; }-------- > только этот понятен
// Кстати, довольно зловредный оператор. В ряде случаев мешает.
// Лучше уж ввести в CSomePtr метод reference(), возвращающий ссылку на переменную-член
RL>T* operator->() { assert(m_pI != NULL); return m_pI; }
// оператор доступа
((ISome*)ptr)->method();
ptr->method();
Оператор -> — занятная фича языка С++. В выражении obj->member выполняется следующее:
result_of_arrow_1 t1 = obj.operator->();
// если result_of_arrow_1 - не указатель, то
result_of_arrow_2 t2 = t1.operator->();
// если опять не указатель, то
result_of_arrow_3 t3 = t2.operator->();
...
// наконец, tN - это указатель
(*tN).member