将lambda作为回调传递给C函数

时间:2019-03-28 10:50:05

标签: c++ c++11 lambda callback idiomatic

假设我有一个C函数

typedef void (* callback_t)(void* data);
status_you_dont_care_about register_callback(callback_t callback, void* data);

我想传递一个lambda作为回调。

什么是惯用的方式...

  1. 当lambda什么也没捕获到吗?
  2. 当lambda捕获时(按值,按引用等)?

1 个答案:

答案 0 :(得分:0)

非捕获案例

正如评论者所指出的,lambda隐式转换为适当类型的函数指针,因此我们可以这样写:

auto my_lambda = [](void* data) { /* do stuff here */};
register_callback(my_lambda, get_pointer_to_data());

,它将编译。别忘了检查返回值:-)

捕获案件

这是我目前正在做的事情,但我怀疑这不是最佳选择。

首先,我确保lambda捕获了它需要的所有内容,以便它本身可以通过 no 参数调用(这样,它实际上就不会 not 占用{{1 }}就像回调一样)。然后我使用以下代码:

void*

注意:使用这种方法,回调只能被调用一次。它可以适应需要多次调用的回调的情况,在取消注册/销毁所有需要调用的回调时都可以取消分配。