Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++,用lambda实现Type?_C++_Lambda_Arduino_Typedef - Fatal编程技术网

C++,用lambda实现Type?

C++,用lambda实现Type?,c++,lambda,arduino,typedef,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

我有一个功能,例如:

typedef void(*timercallback)(void);
void timer1_attachInterrupt(timercallback userFunc);
我希望调用成员方法而不是C风格的函数,因此我尝试了以下lambda:

timer1_attachInterrupt([this](void) -> void { _member_method(); });
但是,我得到了编译器错误:

没有合适的转换函数从lambda[]void->void到 timercallback存在

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

我错过了什么

lambda创建一个closure对象,因为它需要捕获状态。因此,不能只在需要常规函数指针的地方传递它

因为您的API没有为将状态传递给回调做任何规定,所以您需要使用一些不愉快的东西,比如全局变量

如果您可以修改timer1\u attachintrupt1,那么我建议您允许它接受任何类型的擦除函子。std::function只是实现以下功能的实用程序:

using timercallback = void(void);
void timer1_attachInterrupt(std::function<timercallback> userFunc);
1很明显,编辑后OP无法继续。但是我把这个建议留给任何能够修改其功能的人。

我错过了什么

lambda创建一个closure对象,因为它需要捕获状态。因此,不能只在需要常规函数指针的地方传递它

因为您的API没有为将状态传递给回调做任何规定,所以您需要使用一些不愉快的东西,比如全局变量

如果您可以修改timer1\u attachintrupt1,那么我建议您允许它接受任何类型的擦除函子。std::function只是实现以下功能的实用程序:

using timercallback = void(void);
void timer1_attachInterrupt(std::function<timercallback> userFunc);
1很明显,编辑后OP无法继续。但是我把这个建议留给任何能够修改其功能的人。

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

您/op必须非常小心:std::函数在其实现中可能是new/malloc。如果是我,那将是我最不希望看到的事情——处理ISR时的任何堆分配。更糟糕的是,由于创建/销毁导致无法控制分配/取消分配


你想做的事不值得你这么做。

好吧,我想对答案发表评论,但因为代表的观点,我不能直接评论。 我的不是答案,而是对上述std::function建议的评论

您/op必须非常小心:std::函数在其实现中可能是new/malloc。如果是我,那将是我最不希望看到的事情——处理ISR时的任何堆分配。更糟糕的是,由于创建/销毁导致无法控制分配/取消分配


这不值得你这么做。

我无法修改定时器附件中断。我以前使用过全局变量,并且必须在类外存储大部分数据。我想让它更面向对象一点。@uhsl_m-你的不幸完全是因为糟糕的API设计。它是全局状态。我无法修改timer1\u attachInterrupt。我以前使用过全局变量,并且必须在类外存储大部分数据。我想让它更面向对象一点。@uhsl_m-你的不幸完全是因为糟糕的API设计。这是一个全球性的国家,阿伦多?如果是,添加tag.Arundo?如果是,添加标签。