2017-08-08 174 views
0

我有一个功能,如:C++,使用lambda实现typedef?

typedef void(*timercallback)(void); 
void timer1_attachInterrupt(timercallback userFunc); 

我想调用成员方法,而不是C风格的函数,所以我曾尝试以下拉姆达:

timer1_attachInterrupt([this](void) -> void { _member_method(); }); 

但是我得到的编译器错误:

No suitable conversion function from "lambda [] void() -> void" to "timercallback" exists

据我所见,lambda具有类似于typedef的void参数,并返回void类似于tyepdef。我错过了什么?

+0

Arundo?如果是这样添加标签。 – Yakk

回答

4

What am I missing?

拉姆达创建一个封闭对象,因为它需要捕捉状态。因此,您不能仅仅在需要常规函数指针的地方传递它。

由于您的API没有对传递状态给回调做任何规定,所以您需要使用像全局变量这样令人不快的东西。

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

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

这是很清楚的OP不能编辑后。但是我可以给任何可能修改功能的人留下建议。

+0

我无法修改timer1_attachInterrupt。我之前使用全局变量,并且必须将大部分数据存储在类之外。我试图让它更多一点OO。 –

+0

@uhsl_m - 你的困境纯粹是由于糟糕的API设计。全球化的状态。 – StoryTeller