C ++,用lambda实现typedef?

时间:2017-08-08 09:48:41

标签: c++ lambda arduino typedef

我有一个如下功能:

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参数,并像tye​​pdef一样返回void。我错过了什么?

2 个答案:

答案 0 :(得分:4)

  

我错过了什么?

lambda创建一个闭包对象,因为它需要捕获状态。因此,您不能将它传递到期望常规函数指针的位置。

由于你的API没有为回调传递状态做任何规定,你需要使用像全局变量那样令人不快的东西。

如果您可以修改timer1_attachInterrupt 1 ,那么我建议您允许它接受任何(类型删除的)仿函数。 std::function只是实现这一目标的实用工具:

using timercallback = void(void);
void timer1_attachInterrupt(std::function<timercallback> userFunc);

<子> 1 很明显OP在编辑后无法完成。但是我给那些可以修改他们的功能的人留下了建议。

答案 1 :(得分:0)

好的,我想对答案发表评论,但是由于代表。点我不能直接。 我的不是答案,而是评论上面的std :: function <>建议。

您/ op必须真正当心:std :: function可能在其实现内部使用new()/ malloc。如果那是我,那将是我想要的最后一件事-处理ISR时的任何堆分配。 (更糟糕的是,由于创建/破坏而导致不受控制的分配/取消分配)。

在您尝试做的事情中不值得。