Qqw*_*qwy 2 c++ lambda closures function-pointers c++14
我处于不幸的境地,一些 C++ 代码需要与用 C 编写的外部库进行对话。具体来说,Enlightenment套件用于处理某些智能手表上的 GUI。
例如,让我们以函数为例ecore_timer_add():
EAPI Ecore_Timer * ecore_timer_add (double interval, Eina_Bool(*function)(void *), const void *data)
Run Code Online (Sandbox Code Playgroud)
调用时,它将function()在interval几秒钟后调用,并data作为单个参数传递给它。
在 C 中,这是具有通用函数回调的唯一方法,因为没有函数重载和模板。然而,在 C++ 中,我们通常使用 lambdas,或者可能使用类似std::function处理回调的工具。
但是我们如何混合这些技术呢?
捕获 lambdas 不能转换为函数指针(这是有道理的,因为它们必须以某种方式传递内部捕获的状态)。
但是,也许可以创建一个不捕获的“包装器”函数,它接收打包在其void * data参数中的 lambda ,然后能够调用它?
我试过写这个,但到目前为止还没有成功。
它可能需要一些高级模板技巧来让编译器弄清楚如何将 lambda 转换为void *.
只需添加另一个间接级别:
auto f = [=]() { /* ... */ };
ecore_timer_add(interval, [](void *data) { return (*reinterpret_cast<decltype(f)*>(data))(); }, &f);
Run Code Online (Sandbox Code Playgroud)
小心这里的生命周期问题(可能想要将捕获的 lambda 填充f到 astd::function并将其存储在某个容器中的某个地方,以便您可以维护指向它的有效指针)。
| 归档时间: |
|
| 查看次数: |
74 次 |
| 最近记录: |