1

我正在使用 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 );
}
4

2 回答 2

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);
}
于 2013-11-12T22:30:44.650 回答
2

您不能将指向成员函数的指针分配给 C 风格的函数指针。您必须使用自由函数或静态函数,然后在其中调用您需要的任何成员。

其实,std::bind可以让你去做。虽然不完全确定。

于 2013-11-12T19:57:50.757 回答