#include <iostream>
#include <vector>
#include <functional>
#include <type_traits>
using namespace std;
enum Event
{
KEYBOARD_INPUT,
MOUSE_INPUT
};
std::vector< std::function<void(int,int)> > keyboard_handlers;
std::vector< std::function<void(int,int,int)> > mouse_handlers;
template <Event EventType,typename Func,
typename std::enable_if<EventType==KEYBOARD_INPUT,bool>::type=true>
void addEventHandler(Func&& func)
{
keyboard_handlers.push_back(
std::function<void(int,int)>(std::forward<Func>(func)));
}
template <Event EventType,typename Func,
typename std::enable_if<EventType==MOUSE_INPUT,bool>::type=true>
void addEventHandler(Func&& func)
{
mouse_handlers.push_back(
std::function<void(int,int,int)>(std::forward<Func>(func)));
}
void call_keyboard_handlers(int a,int b)
{
for (auto inputCallbackFunc : keyboard_handlers) {
inputCallbackFunc(a,b);
}
}
void keyboard_callback_1(std::string name, int a , int b)
{
std::cout << "keyboard_callback_1 " << name << " " << a << " " << b << std::endl;
}
void keyboard_callback_2(int a , int b)
{
std::cout << "keyboard_callback_2 " << a << " " << b << std::endl;
}
struct keyboard_callback_3_type
{
void operator()(int a,int b)
{
std::cout << "keyboard_callback_3 " << a << " " << b << std::endl;
}
};
int main() {
//With an extra bound in string argument.
addEventHandler<KEYBOARD_INPUT>(std::bind(&keyboard_callback_1,"somestring",std::placeholders::_1,std::placeholders::_2));
//From a plain function pointer
addEventHandler<KEYBOARD_INPUT>(&keyboard_callback_2);
//From a memberfunction pointer
keyboard_callback_3_type keyboard_callback_3;
addEventHandler<KEYBOARD_INPUT>(std::bind(&keyboard_callback_3_type::operator(),&keyboard_callback_3,std::placeholders::_1,std::placeholders::_2));
//From a non capturing lambda
addEventHandler<KEYBOARD_INPUT>([](int a,int b){ std::cout << "lambda_callback " << a << " " << b <<std::endl;});
std::string capture = "Captured";
//From a capturing lambda
addEventHandler<KEYBOARD_INPUT>([&](int a,int b){ std::cout << "lambda_callback " << capture << " " << a << " " << b <<std::endl;});
call_keyboard_handlers(10,20);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKZW51bSBFdmVudAp7CglLRVlCT0FSRF9JTlBVVCwKCU1PVVNFX0lOUFVUCn07CgoKc3RkOjp2ZWN0b3I8IHN0ZDo6ZnVuY3Rpb248dm9pZChpbnQsaW50KT4gPiBrZXlib2FyZF9oYW5kbGVyczsKc3RkOjp2ZWN0b3I8IHN0ZDo6ZnVuY3Rpb248dm9pZChpbnQsaW50LGludCk+ID4gbW91c2VfaGFuZGxlcnM7CgoKCnRlbXBsYXRlIDxFdmVudCBFdmVudFR5cGUsdHlwZW5hbWUgRnVuYywKICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxFdmVudFR5cGU9PUtFWUJPQVJEX0lOUFVULGJvb2w+Ojp0eXBlPXRydWU+CnZvaWQgYWRkRXZlbnRIYW5kbGVyKEZ1bmMmJiBmdW5jKQp7CmtleWJvYXJkX2hhbmRsZXJzLnB1c2hfYmFjaygKICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoaW50LGludCk+KHN0ZDo6Zm9yd2FyZDxGdW5jPihmdW5jKSkpOwp9Cgp0ZW1wbGF0ZSA8RXZlbnQgRXZlbnRUeXBlLHR5cGVuYW1lIEZ1bmMsCiAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8RXZlbnRUeXBlPT1NT1VTRV9JTlBVVCxib29sPjo6dHlwZT10cnVlPgp2b2lkIGFkZEV2ZW50SGFuZGxlcihGdW5jJiYgZnVuYykKewptb3VzZV9oYW5kbGVycy5wdXNoX2JhY2soCiAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGludCxpbnQsaW50KT4oc3RkOjpmb3J3YXJkPEZ1bmM+KGZ1bmMpKSk7Cn0KCnZvaWQgY2FsbF9rZXlib2FyZF9oYW5kbGVycyhpbnQgYSxpbnQgYikKewoJZm9yIChhdXRvIGlucHV0Q2FsbGJhY2tGdW5jIDoga2V5Ym9hcmRfaGFuZGxlcnMpIHsKCQlpbnB1dENhbGxiYWNrRnVuYyhhLGIpOwogICAgfQp9CgoKdm9pZCBrZXlib2FyZF9jYWxsYmFja18xKHN0ZDo6c3RyaW5nIG5hbWUsIGludCBhICwgaW50IGIpCnsKCXN0ZDo6Y291dCA8PCAia2V5Ym9hcmRfY2FsbGJhY2tfMSAiIDw8IG5hbWUgPDwgIiAiIDw8IGEgPDwgIiAiIDw8IGIgPDwgc3RkOjplbmRsOwp9Cgp2b2lkIGtleWJvYXJkX2NhbGxiYWNrXzIoaW50IGEgLCBpbnQgYikKewoJc3RkOjpjb3V0IDw8ICJrZXlib2FyZF9jYWxsYmFja18yICIgIDw8IGEgPDwgIiAiIDw8IGIgPDwgc3RkOjplbmRsOwp9CgpzdHJ1Y3Qga2V5Ym9hcmRfY2FsbGJhY2tfM190eXBlCnsKCXZvaWQgb3BlcmF0b3IoKShpbnQgYSxpbnQgYikKCXsKCQkJc3RkOjpjb3V0IDw8ICJrZXlib2FyZF9jYWxsYmFja18zICIgIDw8IGEgPDwgIiAiIDw8IGIgPDwgc3RkOjplbmRsOwoJfQp9OwoKaW50IG1haW4oKSB7CgkvL1dpdGggYW4gZXh0cmEgYm91bmQgaW4gc3RyaW5nIGFyZ3VtZW50LgoJYWRkRXZlbnRIYW5kbGVyPEtFWUJPQVJEX0lOUFVUPihzdGQ6OmJpbmQoJmtleWJvYXJkX2NhbGxiYWNrXzEsInNvbWVzdHJpbmciLHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSxzdGQ6OnBsYWNlaG9sZGVyczo6XzIpKTsKCS8vRnJvbSBhIHBsYWluIGZ1bmN0aW9uIHBvaW50ZXIJCglhZGRFdmVudEhhbmRsZXI8S0VZQk9BUkRfSU5QVVQ+KCZrZXlib2FyZF9jYWxsYmFja18yKTsKCQoJLy9Gcm9tIGEgbWVtYmVyZnVuY3Rpb24gcG9pbnRlcgoJa2V5Ym9hcmRfY2FsbGJhY2tfM190eXBlIGtleWJvYXJkX2NhbGxiYWNrXzM7CglhZGRFdmVudEhhbmRsZXI8S0VZQk9BUkRfSU5QVVQ+KHN0ZDo6YmluZCgma2V5Ym9hcmRfY2FsbGJhY2tfM190eXBlOjpvcGVyYXRvcigpLCZrZXlib2FyZF9jYWxsYmFja18zLHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSxzdGQ6OnBsYWNlaG9sZGVyczo6XzIpKTsKCgkvL0Zyb20gYSBub24gY2FwdHVyaW5nIGxhbWJkYQoJYWRkRXZlbnRIYW5kbGVyPEtFWUJPQVJEX0lOUFVUPihbXShpbnQgYSxpbnQgYil7IHN0ZDo6Y291dCA8PCAibGFtYmRhX2NhbGxiYWNrICIgPDwgYSA8PCAiICIgPDwgIGIgPDxzdGQ6OmVuZGw7fSk7CgkKCXN0ZDo6c3RyaW5nIGNhcHR1cmUgPSAiQ2FwdHVyZWQiOwoJLy9Gcm9tIGEgY2FwdHVyaW5nIGxhbWJkYQoJYWRkRXZlbnRIYW5kbGVyPEtFWUJPQVJEX0lOUFVUPihbJl0oaW50IGEsaW50IGIpeyBzdGQ6OmNvdXQgPDwgImxhbWJkYV9jYWxsYmFjayAiIDw8IGNhcHR1cmUgPDwgIiAiIDw8IGEgPDwgIiAiIDw8ICBiIDw8c3RkOjplbmRsO30pOwoJCgkKCWNhbGxfa2V5Ym9hcmRfaGFuZGxlcnMoMTAsMjApOwoJCglyZXR1cm4gMDsKfQ==