Спецификация функции-члена в ключевом слове template
От: Virtus  
Дата: 04.03.08 10:24
Оценка:
Вопрос по шаблонам, подскажите, пожалуйста...
Мне требуется передавать в шаблонные функции указатели на функции-члены различных классов.
Причем сигнатура функций-членов классов одинаковая — это callback'и. Внутри шаблонной функции
создается объект шаблонного класса — функтор, который впоследствии при возникновении опреде-
ленного события передаст управление связанному с ним обработчику — функции-члену.
Псевдокод:

template <class T>
void CBasic::connect_activate_mouse( T* pObj, int ( T::*pMFn )( CWidget* widget, PtCallbackInfo_t* cbinfo ) ) {
connect( CB_REASON_LEFTBUTTON_UP, new TFunctor<T>( pObj, pMFn ) );
}

template <class T>
void CBasic::connect_activate_key( T* pObj, int ( T::*pMFn )( CWidget* widget, PtCallbackInfo_t* cbinfo ) ) {
connect( CB_REASON_KEY_DOWN, new TFunctor<T>( pObj, pMFn ) );
}

Хотелось бы вынести полную спецификацию функции-члена в ключевое слово template, вместо указатия
ее в параметрах функции:

template <class T, typename int ( T::*MemFn )( CWidget* widget, PtCallbackInfo_t* cbinfo ) >
void CBasic::connect_activate_mouse( T* pObj, MemFn pMFn ) {
connect( CB_REASON_LEFTBUTTON_UP, new TFunctor<T>( pObj, pMFn ) );
}

template <class T, typename int ( T::*MemFn )( CWidget* widget, PtCallbackInfo_t* cbinfo ) >
void CBasic::connect_activate_key( T* pObj, MemFn pMFn ) {
connect( CB_REASON_KEY_DOWN, new TFunctor<T>( pObj, pMFn ) );
}

Но такой вариант не компилируется...
Встречал еще такой вариант, но здесь по-моему идет речь о значении по-умолчанию:

template<typename T, typename F = bool (T::*)(CDC*)>
PaintMessageHandler(T* obj, const F& f = &T::OnDraw)
{
return PaintMessageHandler(obj, boost::bind(f, obj, _1));
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.