Callback_27.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. // Callback_24.cpp : Diese Datei enthält die Funktion "main". Hier beginnt und endet die Ausführung des Programms.
  2. //
  3. // https://github.com/wisoltech/cpp11-callbacks/blob/master/callback4.cc
  4. // https://www.wisol.ch/w/articles/2015-03-08-callbacks-in-cpp11/
  5. //
  6. //
  7. #include <iostream>
  8. #include <vector>
  9. #include <functional>
  10. #include <map>
  11. #include "cCallbackHdl.h"
  12. #include "cDataStruct.h"
  13. #include "cClassA.h"
  14. typedef std::pair<myData*, myOtherData*> pair;
  15. /***********************************************************************************************************************
  16. * Callback on a c function
  17. */
  18. extern "C"
  19. {
  20. static uint8_t c_client_callback(myData& v)
  21. {
  22. printf("C function callback: %d\n", v.myAge);
  23. printf("%s\n", v.pchar);
  24. return 2;
  25. }
  26. }
  27. /******************************************************************************************************
  28. * I need the flexibility to use other classes, e.g. myOtherData
  29. */
  30. extern "C"
  31. {
  32. static uint8_t c_client2_callback(myOtherData& v)
  33. {
  34. printf("C function callback: %d\n", v.myAge);
  35. printf("%s\n", v.pchar);
  36. return 4;
  37. }
  38. }
  39. extern "C"
  40. {
  41. static uint8_t c_client3_callback(myOtherData& v, myData& x)
  42. {
  43. printf("C function callback: %d\n", v.myAge);
  44. printf("%s\n", v.pchar);
  45. return 5;
  46. }
  47. }
  48. class Button;
  49. /***********************************************************************************************************************
  50. * Dummy Client #1
  51. * Uses a static method for a callback.
  52. */
  53. struct Client1
  54. {
  55. static uint8_t func0(myData v)
  56. {
  57. printf("static Client0::func0 %d\n", v.myAge);
  58. return 3;
  59. }
  60. static uint8_t func1(myData& v, myData& w)
  61. {
  62. printf("static Client1::func1 %d\n", v.myAge);
  63. printf("static Client1::func1 %d\n", w.myAge);
  64. return 3;
  65. }
  66. static uint8_t func2(void* v, void* w) {
  67. myData* x = (myData*) v;
  68. Button* y = (Button*) w;
  69. printf("static Client1::func2 %d\n", x->myAge);
  70. printf("static Client1::func2 %d\n", x->myAge);
  71. return 4;
  72. };
  73. };
  74. auto lambda = [&](myData v) {
  75. std::cout << "Lambda: " << v.myAge * 2 << std::endl;
  76. return 0;
  77. };
  78. auto lambda2 = [&](void* v, void* w) {
  79. std::cout << "Lambda: " << std::endl;
  80. return 0;
  81. };
  82. class Button {
  83. public:
  84. cCallbackHdl cbHdl;
  85. myData mydata{ 24, "myData struct", myData::FEMALE };
  86. myOtherData myOtherdata { 34, "myOtherdata struct", myOtherData::FEMALE };
  87. /*************************************************************************************
  88. *
  89. */
  90. void init() {
  91. /**************************************************************************************
  92. * https://en.cppreference.com/w/cpp/language/lambda
  93. * https://stackoverflow.com/questions/6458612/c0x-proper-way-to-receive-a-lambda-as-parameter-by-reference
  94. */
  95. // int x = (lambda)(mydata);
  96. /*
  97. *
  98. */
  99. auto resmap = cbHdl.CallBack_register(CALLBACK_TYPE::A, [](myData mydata) {
  100. printf("lambda callback: %d\n", mydata.myAge);
  101. return 2;
  102. });
  103. resmap = cbHdl.CallBack_register(CALLBACK_TYPE::B, &c_client_callback);
  104. resmap = cbHdl.CallBack_register(CALLBACK_TYPE::C, &Client1::func0);
  105. resmap = cbHdl.CallBack_register(CALLBACK_TYPE::D, lambda);
  106. resmap = cbHdl.CallBack_V_register(CALLBACK_TYPE::D, lambda2);
  107. resmap = cbHdl.CallBack_V_call(CALLBACK_TYPE::D, (void*)&myOtherdata, (void*) nullptr);
  108. resmap = cbHdl.CallBack_V_register(CALLBACK_TYPE::D, &Client1::func2);
  109. resmap = cbHdl.CallBack_V_call(CALLBACK_TYPE::D, (void*) &myOtherdata, (void*) this);
  110. }
  111. /**********************************************************************************************/
  112. void run() {
  113. std::cout << " run ..." << std::endl;
  114. uint8_t x = cbHdl.CallBack_call(CALLBACK_TYPE::A, mydata);
  115. x = cbHdl.CallBack_call(CALLBACK_TYPE::B, mydata);
  116. x = cbHdl.CallBack_call(CALLBACK_TYPE::C, mydata);
  117. x = cbHdl.CallBack_call(CALLBACK_TYPE::D, mydata);
  118. }
  119. };
  120. /***********************************************************************************************************************
  121. * Callback on a c function
  122. */
  123. int main()
  124. {
  125. std::cout << "Hello World!\n";
  126. Button button;
  127. A classA;
  128. /*
  129. * https://www.wisol.ch/w/articles/2015-03-08-callbacks-in-cpp11/
  130. */
  131. myData mostData; // = { 127, "test Lampda", myData::FEMALE };
  132. // mostData.myAge = 25;
  133. // mostData.pchar = "mostData";
  134. // mostData.sex = mostData.DIVERS;
  135. button.init();
  136. button.run();
  137. classA.init();
  138. classA.run();
  139. return 1;
  140. }