gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:39:07 26 4
gpt4 key购买 nike

假设我有一个 C 函数

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

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

执行此操作的惯用方法是什么...

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

最佳答案

非捕获情况

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

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

这将编译。不要忘记检查返回值:-)

捕获案例

这是我目前正在做的事情,但我怀疑它不是最优的。

首先,我确保 lambda 捕获它需要的一切,以便它本身可以使用没有参数调用(这样它实际上接受 void* 就像回调一样)。然后我使用这段代码:

template <typename Invokable>
void callback_adapter(void *invokable_on_heap)
{
auto retyped_callback = std::unique_ptr<Invokable>{
reinterpret_cast<Invokable*>(invokable_on_heap)
};
(*retyped_callback)(std::forward<Ts>(parameters)...);
// Note: invokable_on_heap will be delete'd
}

template <typename Invokable>
void register_invokable_as_callback(Invokable callback_) {
Invokable* invokable_on_the_heap = new Invokable(std::move(callback_));
register_callback(&callback_adapter<Invokable>, invokable_on_the_heap);
}

注意:使用这种方法,回调只能被调用一次。它可以适应需要多次调用的回调的情况,在取消注册/销毁任何调用的回调时进行释放。

关于c++ - 将 lambda 作为回调传递给 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55395717/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com