Using the Ticker library for the ESP32, how can I use a lambda as an argument to the attach method?
tickerSystemManager.attach(1000, [&](){
systemManager->sync();
});
Attempting to use the above, I get the following error:
Matrx.cpp:11:4: error: no matching function for call to 'Ticker::attach(int, Matrx::setup()::<lambda()>)'
...
Ticker.h:40:8: note: candidate: void Ticker::attach(float, Ticker::callback_t)
How can I capp a lambda into this method?
1 Answer 1
As @timemage explains in a comment, you cannot pass a capturing lambda
to a function that expects a plain pointer to function. There is,
however, a way out of this: the Ticker
class provides an overload of
the attach()
method that allows you to provide a parameter of any type
to tour callback:
template<typename TArg>
void attach(float seconds, void (*callback)(TArg), TArg arg)
You can use this version of attach()
and provide it both
- a non-capturing lambda that gets a pointer to
systemManager
- that pointer as a third argument.
Edit: I did a few tests, and it seems my compiler cannot properly perform template argument deduction in this case, but the approach works if you explicitly specialize the template. Namely:
tickerSystemManager.attach<typeof systemManager>(
1000,
[](typeof systemManager p){ p->sync(); },
systemManager);
-
You've managed to make this on topic. Might as well go a step further and show the user-data-capable overload in the context of a lambda expression.timemage– timemage2021年01月31日 13:30:13 +00:00Commented Jan 31, 2021 at 13:30
-
@timemage: Good suggestion. I updated the answer.Edgar Bonet– Edgar Bonet2021年01月31日 16:40:36 +00:00Commented Jan 31, 2021 at 16:40
-
I really appreciate the answer, this compiled and seems to run as expected! I am still trying to learn Cpp while setting up an ESP project and you are definitely giving me more to look into!Matt Clark– Matt Clark2021年02月02日 06:54:29 +00:00Commented Feb 2, 2021 at 6:54
&
from the capture.