我有一个如下功能:
typedef void(*timercallback)(void);
void timer1_attachInterrupt(timercallback userFunc);
我希望调用成员方法而不是C样式函数,所以我尝试了以下lambda:
timer1_attachInterrupt([this](void) -> void { _member_method(); });
但是我收到编译错误:
没有合适的转换函数来自“lambda [] void() - > void”to “timercallback”存在
据我所知,lambda有类似typedef的void参数,并像tyepdef一样返回void。我错过了什么?
答案 0 :(得分:4)
我错过了什么?
lambda创建一个闭包对象,因为它需要捕获状态。因此,您不能将它传递到期望常规函数指针的位置。
由于你的API没有为回调传递状态做任何规定,你需要使用像全局变量那样令人不快的东西。
如果您可以修改timer1_attachInterrupt
1 ,那么我建议您允许它接受任何(类型删除的)仿函数。 std::function
只是实现这一目标的实用工具:
using timercallback = void(void);
void timer1_attachInterrupt(std::function<timercallback> userFunc);
<子> 1 很明显OP在arduino编辑后无法完成。但是我给那些可以修改他们的功能的人留下了建议。 子>
答案 1 :(得分:0)
好的,我想对答案发表评论,但是由于代表。点我不能直接。 我的不是答案,而是评论上面的std :: function <>建议。
您/ op必须真正当心:std :: function可能在其实现内部使用new()/ malloc。如果那是我,那将是我想要的最后一件事-处理ISR时的任何堆分配。 (更糟糕的是,由于创建/破坏而导致不受控制的分配/取消分配)。
在您尝试做的事情中不值得。