| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- // Callback_24.cpp : Diese Datei enthält die Funktion "main". Hier beginnt und endet die Ausführung des Programms.
- //
- // https://github.com/wisoltech/cpp11-callbacks/blob/master/callback4.cc
- // https://www.wisol.ch/w/articles/2015-03-08-callbacks-in-cpp11/
- //
- //
- #include <iostream>
- #include <vector>
- #include <functional>
- #include <map>
- #include "cCallbackHdl.h"
- #include "cDataStruct.h"
- #include "cClassA.h"
- /***********************************************************************************************************************
- * Callback on a c function
- */
- extern "C"
- {
- static uint8_t c_client_callback(myData& v)
- {
- printf("C function callback: %d\n", v.myAge);
- printf("%s\n", v.pchar);
- return 0;
- }
- }
- using func1 = cCallbackHdl::Cb_t<myData&>;
- std::unique_ptr<func1> f1(new func1(&c_client_callback));
- /******************************************************************************************************
- * I need the flexibility to use other classes, e.g. myOtherData
- */
- extern "C"
- {
- static uint8_t c_client2_callback(myOtherData& v)
- {
- printf("C function callback: %d\n", v.myAge);
- printf("%s\n", v.pchar);
- return 0;
- }
- using func2 = cCallbackHdl::Cb_t<myOtherData&>;
- std::unique_ptr<func2> f2(new func2(&c_client2_callback)); }
- extern "C"
- {
- static uint8_t c_client3_callback(myOtherData& v, myData& x)
- {
- printf("C function callback: %d\n", v.myAge);
- printf("%s\n", v.pchar);
- return 0;
- }
- using func3 = cCallbackHdl::Cb_t<myOtherData&, myData&>;
- std::unique_ptr<func3> f3(new func3(&c_client3_callback));
- }
- class Button {
- public:
- cCallbackHdl cbHdl;
- myData mydata {25, "Text", myData::DIVERS};
- myOtherData myOtherdata{ 41, "myOtherData", myOtherData::FEMALE};
- uint8_t myAge = 95;
- void init() {
- auto result = cbHdl.callbacks.insert(std::make_pair(cCallbackHdl::en_event::A, std::move(f1)));
- result = cbHdl.callbacks.insert(std::make_pair(cCallbackHdl::en_event::B, std::move(f2)));
- result = cbHdl.callbacks.insert(std::make_pair(cCallbackHdl::en_event::C, std::move(f3)));
- result = cbHdl.callbacks.insert(std::make_pair(cCallbackHdl::en_event::C, std::move(f1)));
- /**************************************************************************************
- * https://en.cppreference.com/w/cpp/language/lambda
- * https://stackoverflow.com/questions/6458612/c0x-proper-way-to-receive-a-lambda-as-parameter-by-reference
- */
- const auto lambda = [](myData v) { std::cout << "Lambda: " << v.myAge * 2 << std::endl; return 0; };
- int x = (lambda)(mydata);
- (lambda)(mydata);
- }
- void run() {
- std::cout << " run ..." << std::endl;
- uint8_t x = cbHdl.call(cCallbackHdl::en_event::A, mydata);
- x = cbHdl.call(cCallbackHdl::en_event::B, myOtherdata);
- x = cbHdl.call(cCallbackHdl::en_event::C, myOtherdata, mydata);
- x = cbHdl.call(cCallbackHdl::en_event::D, myOtherdata, mydata);
- }
- };
- /***********************************************************************************************************************
- * Callback on a c function
- */
- int main()
- {
- std::cout << "Hello World!\n";
- Button button;
- A classA;
- #if 0
- /*
- * https://www.wisol.ch/w/articles/2015-03-08-callbacks-in-cpp11/
- */
- auto result = callbacks.insert(std::make_pair(A, std::move(f1)));
- result = callbacks.insert(std::make_pair(B, std::move(f2)));
- result = callbacks.insert(std::make_pair(C, std::move(f3)));
- result = callbacks.insert(std::make_pair(C, std::move(f1)));
- #endif
- myData mostData = { 127, "test Lampda", myData::FEMALE };
- button.init();
- button.run();
- classA.init();
- classA.run();
- return 1;
- }
|