C++ 为SDL事件筛选创建指向成员函数的非常量指针

C++ 为SDL事件筛选创建指向成员函数的非常量指针,c++,c++11,sdl,function-pointers,member-function-pointers,C++,C++11,Sdl,Function Pointers,Member Function Pointers,我正在使用SDL,并试图提供一个指向事件过滤器的函数指针。如果我将函数设置为ObjectWithState的静态成员,那么这很好,但是我希望回调函数改变对象的状态。我本想用函子来做这件事,但我没法完全解决 有没有什么C++11技巧可以让这一切顺利进行 class ObjectWithState { int someState; public: int operator()(void* userData, SDL_Event *event) { r

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

不能将指向成员函数的指针指定给C样式的函数指针。您必须使用自由函数或静态函数,然后调用其中所需的任何成员


实际上,
std::bind
可能允许您这样做。但不完全确定。

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


实际上,
std::bind
可能允许您这样做。但不完全确定。

使用
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);
}
类ObjectWithState
{
int-someState;
公众:
int运算符()(SDL_事件*事件)
{
++某个州
}
静态int分派(void*userdata,SDL_事件*Event)
{
返回static_cast(userdata)->operator()(事件);
}
};
int main()
{
//样板
对象与状态obj;
SDL_SetEventFilter(&ObjectWithState::dispatch,&obj);
}

使用
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);
}
类ObjectWithState
{
int-someState;
公众:
int运算符()(SDL_事件*事件)
{
++某个州
}
静态int分派(void*userdata,SDL_事件*Event)
{
返回static_cast(userdata)->operator()(事件);
}
};
int main()
{
//样板
对象与状态obj;
SDL_SetEventFilter(&ObjectWithState::dispatch,&obj);
}

Unrelated:your
operator()
实际上并没有返回声明的
int
。是的,对不起,情况过于简化了Unrelated:your
operator()
实际上并没有返回声明的
int
。是的,对不起,情况过于简化了