fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <functional>
  4. #include <type_traits>
  5. using namespace std;
  6.  
  7. enum Event
  8. {
  9. KEYBOARD_INPUT,
  10. MOUSE_INPUT
  11. };
  12.  
  13.  
  14. std::vector< std::function<void(int,int)> > keyboard_handlers;
  15. std::vector< std::function<void(int,int,int)> > mouse_handlers;
  16.  
  17.  
  18.  
  19. template <Event EventType,typename Func,
  20. typename std::enable_if<EventType==KEYBOARD_INPUT,bool>::type=true>
  21. void addEventHandler(Func&& func)
  22. {
  23. keyboard_handlers.push_back(
  24. std::function<void(int,int)>(std::forward<Func>(func)));
  25. }
  26.  
  27. template <Event EventType,typename Func,
  28. typename std::enable_if<EventType==MOUSE_INPUT,bool>::type=true>
  29. void addEventHandler(Func&& func)
  30. {
  31. mouse_handlers.push_back(
  32. std::function<void(int,int,int)>(std::forward<Func>(func)));
  33. }
  34.  
  35. void call_keyboard_handlers(int a,int b)
  36. {
  37. for (auto inputCallbackFunc : keyboard_handlers) {
  38. inputCallbackFunc(a,b);
  39. }
  40. }
  41.  
  42.  
  43. void keyboard_callback_1(std::string name, int a , int b)
  44. {
  45. std::cout << "keyboard_callback_1 " << name << " " << a << " " << b << std::endl;
  46. }
  47.  
  48. void keyboard_callback_2(int a , int b)
  49. {
  50. std::cout << "keyboard_callback_2 " << a << " " << b << std::endl;
  51. }
  52.  
  53. struct keyboard_callback_3_type
  54. {
  55. void operator()(int a,int b)
  56. {
  57. std::cout << "keyboard_callback_3 " << a << " " << b << std::endl;
  58. }
  59. };
  60.  
  61. int main() {
  62. //With an extra bound in string argument.
  63. addEventHandler<KEYBOARD_INPUT>(std::bind(&keyboard_callback_1,"somestring",std::placeholders::_1,std::placeholders::_2));
  64. //From a plain function pointer
  65. addEventHandler<KEYBOARD_INPUT>(&keyboard_callback_2);
  66.  
  67. //From a memberfunction pointer
  68. keyboard_callback_3_type keyboard_callback_3;
  69. addEventHandler<KEYBOARD_INPUT>(std::bind(&keyboard_callback_3_type::operator(),&keyboard_callback_3,std::placeholders::_1,std::placeholders::_2));
  70.  
  71. //From a non capturing lambda
  72. addEventHandler<KEYBOARD_INPUT>([](int a,int b){ std::cout << "lambda_callback " << a << " " << b <<std::endl;});
  73.  
  74. std::string capture = "Captured";
  75. //From a capturing lambda
  76. addEventHandler<KEYBOARD_INPUT>([&](int a,int b){ std::cout << "lambda_callback " << capture << " " << a << " " << b <<std::endl;});
  77.  
  78.  
  79. call_keyboard_handlers(10,20);
  80.  
  81. return 0;
  82. }
Success #stdin #stdout 0s 15240KB
stdin
Standard input is empty
stdout
keyboard_callback_1 somestring 10 20
keyboard_callback_2 10 20
keyboard_callback_3 10 20
lambda_callback 10 20
lambda_callback Captured 10 20