Pico GPS Teseo I2C
Loading...
Searching...
No Matches
callback_examples.cpp
Go to the documentation of this file.
1// https://community.element14.com/products/devtools/software/f/forum/54719/c-callbacks-and-templates
2
3
4#include <cstdio>
5#include <string>
6#include <typeinfo>
7
8import callbackmanager;
9
10class MyClass {
11public:
12 inline int handler(const int& num1, const int& num2) const {
13 return num1 + num2;
14 }
15 static inline int staticHandler(const int& num1, const int& num2) {
16 return num1 + num2;
17 }
18};
19
20int functionHandler(const int& num1, const int& num2) {
21 return num1 + num2;
22}
23
24int main() {
25
26 int a = 4;
27 int b = 5;
28
29 { // scenario: call object method
30 MyClass myClass;
31
33 // Use a lambda to capture myClass and call the object method
34 cb.set([&myClass](const int& num1, const int& num2) -> int const {
35 return myClass.handler(num1, num2);
36 });
37
38 int o = cb(a, b);
39 printf("Value: %i\n", o);
40 fflush(stdout);
41 }
42
43 { // scenario: call static method
45 // Use a lambda to call the static method
46 cb.set([](const int& num1, const int& num2) -> int {
47 return MyClass::staticHandler(num1, num2);
48 });
49
50 int o = cb(a, b);
51 printf("Value: %i\n", o);
52 fflush(stdout);
53 }
54
55 { // scenario: call C function
57 // Use a lambda to call the classic C function
58 cb.set([](const int& num1, const int& num2) -> int {
59 return functionHandler(num1, num2);
60 });
61
62 int o = cb(a, b);
63 printf("Value: %i\n", o);
64 fflush(stdout);
65 }
66
67 { // scenario: call pure lambda
69 // Use a lambda to execute anonymous C code
70 cb.set([](const int& num1, const int& num2) -> int {
71 return num1 + num2;
72 });
73
74 int o = cb(a, b);
75 printf("Value: %i\n", o);
76 fflush(stdout);
77 }
78
79 { // scenario: return a bool
81 // Use a lambda to execute anonymous C code
82 cb.set([](const int& num1, const int& num2) -> bool {
83 return num1 == num2;
84 });
85
86 printf("Value: %s\n", cb(a, b) ? "true" : "false");
87 fflush(stdout);
88 }
89
90 { // scenario: use void
92 // Use a lambda to execute anonymous C code
93 cb.set([](const int& num1, const int& num2) {
94 printf("void gets num1: %i, num2: %i\n", num1, num2);
95 fflush(stdout);
96 return;
97 });
98 cb(a, b);
99 }
100
101 { // scenario: use void, and no attributes
103 // Use a lambda to execute anonymous C code
104 cb.set([]() {
105 printf("void with no parameters\n");
106 fflush(stdout);
107 return;
108 });
109 cb();
110 }
111
112 { // scenario: use void, and a const std::string reference
114 // Use a lambda to execute anonymous C code
115 cb.set([](const std::string& s) {
116 printf("%s", s.c_str());
117 fflush(stdout);
118 return;
119 });
120 cb("hello, world!\r\n");
121 }
122
123 { // scenario: use void, and a const std::string reference
124 std::string updateme;
126 // Use a lambda to execute anonymous C code
127 cb.set([](std::string& s) {
128 s.assign("hello, world!\r\n");
129 return;
130 });
131 cb(updateme);
132 printf("%s", updateme.c_str());
133 fflush(stdout);
134 }
135
136 { // scenario: return an object
137 class return_class {
138 public:
139 return_class() : value_(0) {};
140 int value_;
141 };
142
144 // Use a lambda to execute anonymous C code
145 cb.set([]() -> return_class {
146 return_class rc;
147 rc.value_ = 1;
148 return rc;
149 });
150 return_class ret = cb();
151 printf("Value: %d\n", ret.value_ );
152 fflush(stdout);
153 }
154
155 { // scenario: constructor with lambda
157 [](const int& num1, const int& num2) -> bool {
158 return num1 == num2;
159 });
160
161 printf("Value: %s\n", cb(a, b) ? "true" : "false");
162 fflush(stdout);
163 }
164
165 // { // scenario: use an unsupported (non-fundamental) type for return value R
166 // // this will generate a compile error
167 // callbackmanager::Callback<char[], const int&, const int&> cb;
168 // }
169
170}
171
int functionHandler(const int &num1, const int &num2)
int main()
int handler(const int &num1, const int &num2) const
static int staticHandler(const int &num1, const int &num2)
void set(callbackfunction_t &&callback)