я пытаюсь сделать систему событий
Пользователь этой системы должен выполнить это, чтобы добавить событие для ввода, например:
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, которые могут быть сохранены и вызваны позже?