我想实现一个回调处理程序。方法应该像下面这样简单地注册......
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
}
}
...因为不可能比较绑定函数。
延迟注销也不起作用,因为无法验证函数对象。
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();
}
}
那么我应该如何处理这样的实现,如何避免我遇到的问题呢?