Добрый день.
Разьясните плиз такую вещь.
Очень часто в WTL встречается такой код:
HRESULT Run(int nShowCmd = SW_HIDE) throw()
{
HRESULT hr = S_OK;
T* pT = static_cast<T*>(this);
hr = pT->PreMessageLoop(nShowCmd);
Зачем вызовы делаются через указатель на себя, а не напрямую?
Здравствуйте, 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, Вы писали:
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 виртуальным
Здравствуйте, Mr., Вы писали:
SVZ>>Чтобы иметь возможность вызвать переопределенный метод T::PreMessageLoop.
SVZ>>Этакий compile-time полиморфизм.
Mr.>Так можно сделать PreMessageLoop виртуальным
Можно, ничто не мешает, но это не WTL-way
Здравствуйте, Mr., Вы писали:
Mr.>Зачем вызовы делаются через указатель на себя, а не напрямую?
возможно, в целях оптимизации (избежать виртуальный вызов)
такой подход часто применяют в CRTP (
http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern )