T* pT = static_cast<T*>(this);
От: Mr.  
Дата: 14.10.11 11:00
Оценка:
Добрый день.
Разьясните плиз такую вещь.
Очень часто в WTL встречается такой код:

    HRESULT Run(int nShowCmd = SW_HIDE) throw()
    {
        HRESULT hr = S_OK;

        T* pT = static_cast<T*>(this);
        hr = pT->PreMessageLoop(nShowCmd);


Зачем вызовы делаются через указатель на себя, а не напрямую?
Re: T* pT = static_cast<T*>(this);
От: Stanislav V. Zudin Россия  
Дата: 14.10.11 11:10
Оценка:
Здравствуйте, Mr., Вы писали:

Mr.>Добрый день.

Mr.>Разьясните плиз такую вещь.
Mr.>Очень часто в WTL встречается такой код:

Mr.>
Mr.>    HRESULT Run(int nShowCmd = SW_HIDE) throw()
Mr.>    {
Mr.>        HRESULT hr = S_OK;

Mr.>        T* pT = static_cast<T*>(this);
Mr.>        hr = pT->PreMessageLoop(nShowCmd);
Mr.>


Mr.>Зачем вызовы делаются через указатель на себя, а не напрямую?


Чтобы иметь возможность вызвать переопределенный метод T::PreMessageLoop.
Этакий compile-time полиморфизм.
_____________________
С уважением,
Stanislav V. Zudin
Re[2]: T* pT = static_cast<T*>(this);
От: Mr.  
Дата: 14.10.11 11:30
Оценка:
Здравствуйте, Stanislav V. Zudin, Вы писали:

SVZ>Здравствуйте, Mr., Вы писали:


Mr.>>Добрый день.

Mr.>>Разьясните плиз такую вещь.
Mr.>>Очень часто в WTL встречается такой код:

Mr.>>
Mr.>>    HRESULT Run(int nShowCmd = SW_HIDE) throw()
Mr.>>    {
Mr.>>        HRESULT hr = S_OK;

Mr.>>        T* pT = static_cast<T*>(this);
Mr.>>        hr = pT->PreMessageLoop(nShowCmd);
Mr.>>


Mr.>>Зачем вызовы делаются через указатель на себя, а не напрямую?


SVZ>Чтобы иметь возможность вызвать переопределенный метод T::PreMessageLoop.

SVZ>Этакий compile-time полиморфизм.

Так можно сделать PreMessageLoop виртуальным
Re[3]: T* pT = static_cast<T*>(this);
От: Stanislav V. Zudin Россия  
Дата: 14.10.11 11:35
Оценка:
Здравствуйте, Mr., Вы писали:

SVZ>>Чтобы иметь возможность вызвать переопределенный метод T::PreMessageLoop.

SVZ>>Этакий compile-time полиморфизм.

Mr.>Так можно сделать PreMessageLoop виртуальным


Можно, ничто не мешает, но это не WTL-way
_____________________
С уважением,
Stanislav V. Zudin
Re: T* pT = static_cast<T*>(this);
От: uzhas Ниоткуда  
Дата: 30.10.11 18:11
Оценка:
Здравствуйте, Mr., Вы писали:

Mr.>Зачем вызовы делаются через указатель на себя, а не напрямую?

возможно, в целях оптимизации (избежать виртуальный вызов)
такой подход часто применяют в CRTP (http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern )
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.