Я хочу реализовать обработчик обратного вызова. Методы должны регистрироваться так легко, как следующие...
std::multimap<Event::Type, std::function<void()>> actions;
void EventManager::registerAction(Event::Type event, std::function<void()> action) {
actions.insert(std::make_pair(event, action));
}
... который действительно работает по назначению.
Но проблема с этим подходом заключается в том, что невозможно отменить регистрацию обратного вызова...
void EventManager::deregisterAction(Event::Type event, std::function<void()> action) {
for(auto i = actions.lower_bound(event); i != actions.upper_bound(event); ++i) {
// if action == i->second
}
}
... потому что невозможно сравнивать связанные функции.
Lazy deregistering также не будет работать, потому что объект функции не может быть проверен.
void EventManager::handle(Event::Type event) {
for(auto i = actions.lower_bound(event); i != actions.upper_bound(event); ++i) {
if(i->second) // returns true even if the object doesn't exist anymore
i->second();
}
}
Итак, как мне подойти к такой реализации, как можно избежать проблем, с которыми я столкнулся?