jsっぽいイベントハンドラがけっこう短いコードで実現できる。
# include <iostream>
# include <functional>
# include <string>
# include <map>
# include <vector>
using namespace std;
struct Event {
Event(const string& name, int data)
: name(name),
data(data) {
}
string name;
int data;
};
typedef function<bool(const Event&)> EventHandler;
int main(int argc, char **argv) {
// set evnet queues
vector<Event> queues;
queues.emplace_back("hoge", 100);
queues.emplace_back("hoge", 101);
// set handlers
multimap<string, EventHandler> handlers;
handlers.emplace("hoge", [](const Event& e) {
cout << "emit hoge event!!!" << e.data << endl;
return true;
});
handlers.emplace("moge", [](const Event& e) {
cout << "emit moge event!!!" << e.data << endl;
return true;
});
// trigger
for (auto event : queues) {
for (auto iter : handlers) {
if (event.name == iter.first) {
iter.second(event);
}
}
}
return 0;
}