Когда-то писал такой обработчик.
Чтобы вызвать функцию член можно воспользоваться обобщенным функторомПример из кода
typedef Functor< void,TYPELIST_2(int,int)> Handler;
class Handlers
{
public:
Handlers(fltk::Widget *w,const Handler& h);
Handlers();
int add_handler(fltk::Widget *w,const Handler& h);
private:
struct Handler_info
{
Handler handler;
fltk::Widget* wdt;
};
static std::list<Handler_info> _handler_list;
static void default_callback(fltk::Widget* w,long l);
static int _next_handler_id;
void to_callback(fltk::Widget *w,const Handler& h);
};
std::list<Handlers::Handler_info> Handlers::_handler_list;
int Handlers::_next_handler_id = 1;
//--------------------------------------------------------------
Handlers::Handlers()
{
}
//---------------------------------------------------------------
//---------------------------------------------------------------
int Handlers::add_handler(fltk::Widget *w,const Handler& h)
{
to_callback(w,h);
return _next_handler_id++;
}
//----------------------------------------------------------------
void Handlers::to_callback(fltk::Widget *w,const Handler& h)
{
assert(w);
Handler_info hi;
hi.handler = h;
hi.wdt = w;
_handler_list.push_back(hi);
w->callback(&Handlers::default_callback);
}
//----------------------------------------------------------------
void Handlers:: default_callback(fltk::Widget* w,long l)
{
for(std::list<Handler_info>::iterator i = _handler_list.begin(); i!= _handler_list.end(); ++i)
{
if(w == i->wdt)
i->handler(w,l);
}
}
Используем так:
class Main_panel
{
void exit(fltk::Widget*,long);
};
void foo()
{
Handlers handlers;
handlers.add_handler(exit,Handler(this,Main_panel::exit));
}