Callback_10.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. #include <iostream>
  2. #include <string>
  3. #include "Header.h" // the implementation is here
  4. /*
  5. * https://stackoverflow.com/questions/2298242/callback-functions-in-c
  6. */
  7. using namespace std;
  8. // a dummy enum for this example
  9. enum EventEnum { EVENT1, EVENT2, EVENT3 };
  10. /**************************************************************************************************************
  11. *
  12. */
  13. class MyClassWithMethod {
  14. public:
  15. unsigned int age = 12;
  16. enum { MALE, FEMALE } sex;
  17. void registerCB(Dispatcher<int, long, double>& dispatcher) {
  18. using namespace std::placeholders;
  19. dispatcher.addCB(std::bind(&MyClassWithMethod::listener, this, _1, _2, _3));
  20. }
  21. #if 1
  22. void registerCB(Dispatcher<string, EventEnum>& dispatcher) {
  23. using namespace std::placeholders;
  24. dispatcher.addCB(std::bind(&MyClassWithMethod::listener2, this, _1, _2));
  25. }
  26. #endif
  27. #if 0
  28. void registerCB(Dispatcher<int, long, double>& dispatcher) {
  29. using namespace std::placeholders;
  30. dispatcher.addCB(std::bind(&MyClassWithMethod::listener, this, _1, _2, _3));
  31. }
  32. #endif
  33. private:
  34. // any method with the right signature can be used:
  35. void listener(int i, long l, double d) {
  36. cout << "listener() for " << this << ", got: " <<
  37. i << ", " << l << ", " << d << endl;
  38. }
  39. void listener2(string str, EventEnum evt) {
  40. cout << "listener() for " << this << ", got: " <<
  41. str << ", " << evt << endl;
  42. }
  43. };
  44. /**************************************************************************************************************
  45. *
  46. */
  47. // template <class T>
  48. void myCb(string str, EventEnum evt) {
  49. cout << "myCb: " << str << " got event " << evt << endl;
  50. }
  51. int main(int argc, char* argv[])
  52. {
  53. // 2 example dispatchers, any number of arguments and types can be used:
  54. Dispatcher<string, EventEnum> d1;// here any cb(string, EventEnum) can register
  55. Dispatcher<int, long, double> d2;// here any cb(int, long, double) can register
  56. uint8_t mainAge = 12;
  57. //
  58. // From the "most simple" lambda usage example ...
  59. //
  60. auto cbid1 = d1.addCB([&](string str, EventEnum evt) {
  61. cout << "CB1:" << str << " got event " << evt << endl;
  62. });
  63. auto cbid2 = d1.addCB([=](string str, EventEnum evt) {
  64. cout << "CB2:" << str << " got event " << evt << endl;
  65. });
  66. auto cbid3 = d1.addCB(&myCb);
  67. // d1.broadcast("** Dispatching to 2 is **", EVENT1);
  68. // d1.broadcast("** E a s y **", EVENT2);
  69. // d1.delCB(cbid1); // remove the first callback
  70. // d1.broadcast("** Dispatching to 1 is **", EVENT1);
  71. // d1.broadcast("** E a s y **", EVENT2);
  72. // d1.delCB(cbid2); // remove the second callback
  73. // d1.broadcast("** No one will see this **", EVENT3);
  74. // ... to the "most complex" **live** instance (not copy) usage example:
  75. MyClassWithMethod instance1;
  76. MyClassWithMethod instance2;
  77. instance1.registerCB(d1);
  78. instance2.registerCB(d2);
  79. // instance1.registerCB(myCb);
  80. d1.broadcast("myEvent", EVENT3);
  81. d2.broadcast(65000, 12345678910, 3.14159265);
  82. d2.broadcast(56000, 1987654321, 14159265.3);
  83. return 0;
  84. }