我正在尝试制作一个事件系统。该系统的用户需要执行以下操作来添加事件,例如:
addEventHandler(Event::KEYBOARD_INPUT, reinterpret_cast<void*>(&std::bind(&Game::On_Input, this)));
当事件被触发时,传递的函数将被调用,这些函数现在存储在std :: vectors中,目前没有问题。但是不同的事件具有不同的函数签名...
由于std :: function本身就是一种类型,因此我不能让此函数接受所有事件。我尝试将std :: bind转换为void *,然后再将其转换回std :: function,但是它无法工作,因为impl未定义(0xCCCCCCCC)。
当前代码:
void EventManager::addEventHandler(Event event, void* p_Fun)
{
if (event == Event::KEYBOARD_INPUT) {
m_InputCallbacks.push_back(*reinterpret_cast<std::function<void(Keycode, unsigned int)>*>(p_Fun));
}
/*else if(...){ // other events other push backs in other vectors
}*/
}
并且这个函数是以以下方式存储的:
void EventManager::HandleEvents(SDL_Event& Event)
{
while (PollEvent(&Event) != 0) {
if (Event.type == KEYDOWN || Event.type == KEYUP) {
//On_Input(Event.key.keysym.sym, Event.type);
for (auto inputCallbackFunc : m_InputCallbacks) {
inputCallbackFunc(Event.key.keysym.sym, Event.type);//CRASH HERE!
}
}
}
}
请注意,这个版本只处理我不知道未来会有多少事件添加(碰撞、多人连接等...),这就是为什么我想通过 addEventHandler 函数自动化这个过程,它将检查以下内容: 1)事件类型是什么,并将 void 函数指针转换为该事件回调函数签名 2)将它们存储在适当的 std::vector 中。
所以总的来说,如何使 AddEventHandler 接受每个 std::bind 被传递到它,这些可以被存储和稍后调用?
&std::bind(
不起作用,因为你正在获取一个临时对象的指针,绑定的函数在该语句结束时被销毁。 - kmdrekostd::function
不是指针类型... - selbiereinterpret_cast<std::function<...>*>
不起作用,因为std::bind
的结果不是std::function
而是某种未指定的类型。 - kmdrekovoid*
)可能会产生微妙且难以诊断的错误。(两者都不同于成员函数指针。) - Eljay