C++ 为SDL事件筛选创建指向成员函数的非常量指针
我正在使用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
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:youroperator()
实际上并没有返回声明的int
。是的,对不起,情况过于简化了Unrelated:youroperator()
实际上并没有返回声明的int
。是的,对不起,情况过于简化了