#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <map>
class Callback {
public:
Callback(const char *message) : message(message) {
}
void callbackMethod() {
std::cout << message << std::endl;
}
private:
const char *message;
};
template<typename T>
class Worker {
public:
typedef void (T::*CALLBACK_METHOD)();
void registerCallback(T *callbackObj, CALLBACK_METHOD callbackMethod) {
callbacks.insert(callbacks.end(), std::pair<T *, CALLBACK_METHOD>(callbackObj, callbackMethod));
}
void executeCallbacks() {
for (typename std::map<T *, CALLBACK_METHOD>::const_iterator iter = callbacks.begin(); iter != callbacks.end(); ++iter) {
((*iter).first->*((*iter).second))();
}
}
private:
std::map<T *, CALLBACK_METHOD> callbacks;
};
int main(int argc, char **argv) {
Callback firstCallback("first callback called");
Callback secondCallback("second callback called");
Worker<Callback> worker;
worker.registerCallback(&firstCallback, &Callback::callbackMethod);
worker.registerCallback(&secondCallback, &Callback::callbackMethod);
worker.executeCallbacks();
return EXIT_SUCCESS;
}
I2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWFwPgoKY2xhc3MgQ2FsbGJhY2sgewpwdWJsaWM6CiAgICBDYWxsYmFjayhjb25zdCBjaGFyICptZXNzYWdlKSA6IG1lc3NhZ2UobWVzc2FnZSkgewoJfQoJCgl2b2lkIGNhbGxiYWNrTWV0aG9kKCkgewoJCXN0ZDo6Y291dCA8PCBtZXNzYWdlIDw8IHN0ZDo6ZW5kbDsKCX0KCQpwcml2YXRlOgoJY29uc3QgY2hhciAqbWVzc2FnZTsKfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CmNsYXNzIFdvcmtlciB7CnB1YmxpYzoKCXR5cGVkZWYgdm9pZCAoVDo6KkNBTExCQUNLX01FVEhPRCkoKTsKCgl2b2lkIHJlZ2lzdGVyQ2FsbGJhY2soVCAqY2FsbGJhY2tPYmosIENBTExCQUNLX01FVEhPRCBjYWxsYmFja01ldGhvZCkgewoJCWNhbGxiYWNrcy5pbnNlcnQoY2FsbGJhY2tzLmVuZCgpLCBzdGQ6OnBhaXI8VCAqLCBDQUxMQkFDS19NRVRIT0Q+KGNhbGxiYWNrT2JqLCBjYWxsYmFja01ldGhvZCkpOwoJfQoKCXZvaWQgZXhlY3V0ZUNhbGxiYWNrcygpIHsKCQlmb3IgKHR5cGVuYW1lIHN0ZDo6bWFwPFQgKiwgQ0FMTEJBQ0tfTUVUSE9EPjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IGNhbGxiYWNrcy5iZWdpbigpOyBpdGVyICE9IGNhbGxiYWNrcy5lbmQoKTsgKytpdGVyKSB7CgkJCSgoKml0ZXIpLmZpcnN0LT4qKCgqaXRlcikuc2Vjb25kKSkoKTsKCQl9Cgl9Cgpwcml2YXRlOgoJc3RkOjptYXA8VCAqLCBDQUxMQkFDS19NRVRIT0Q+IGNhbGxiYWNrczsKfTsKCmludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgewoJQ2FsbGJhY2sgZmlyc3RDYWxsYmFjaygiZmlyc3QgY2FsbGJhY2sgY2FsbGVkIik7CglDYWxsYmFjayBzZWNvbmRDYWxsYmFjaygic2Vjb25kIGNhbGxiYWNrIGNhbGxlZCIpOwoJCglXb3JrZXI8Q2FsbGJhY2s+IHdvcmtlcjsKCXdvcmtlci5yZWdpc3RlckNhbGxiYWNrKCZmaXJzdENhbGxiYWNrLCAmQ2FsbGJhY2s6OmNhbGxiYWNrTWV0aG9kKTsKCXdvcmtlci5yZWdpc3RlckNhbGxiYWNrKCZzZWNvbmRDYWxsYmFjaywgJkNhbGxiYWNrOjpjYWxsYmFja01ldGhvZCk7Cgl3b3JrZXIuZXhlY3V0ZUNhbGxiYWNrcygpOwoKCXJldHVybiBFWElUX1NVQ0NFU1M7Cn0=