我正在玩SDL,我正在尝试提供一个指向事件过滤器的函数指针。如果我使函数成为ObjectWithState
的静态成员,这可以正常工作,但我想让回调函数改变对象的状态。我希望可能使用仿函数来做这件事,但我不能完全解决它。
我可以使用任何C ++ 11技巧来实现这项功能吗?
class ObjectWithState
{
int someState;
public:
int operator()(void* userData, SDL_Event *event)
{
return ++someState;
}
};
int main()
{
//boilerplate
ObjectWithState obj;
SDL_EventFilter f = &(obj.operator()); //ERROR -> cannot create non-constant pointer to member function
SDL_SetEventFilter( f, nullptr );
}
答案 0 :(得分:4)
使用userdata
参数指向您的对象,并通过静态方法调度到非静态方法:
class ObjectWithState
{
int someState;
public:
int operator()(SDL_Event *event)
{
++someState
}
static int dispatch(void* userdata, SDL_Event* event)
{
return static_cast<ObjectWithState*>(userdata)->operator()(event);
}
};
int main()
{
//boilerplate
ObjectWithState obj;
SDL_SetEventFilter(&ObjectWithState::dispatch, &obj);
}
答案 1 :(得分:1)
您不能将指向成员函数的指针指定给C样式函数指针。您必须使用自由函数或静态函数,然后在其中调用您需要的任何成员。
实际上,std::bind
可能允许您这样做。虽然不完全确定。