【发布时间】:2020-04-30 17:50:22
【问题描述】:
在 C++11 及更高版本中,转换不带捕获变量的 lambda 表达式非常简单,但要正确执行具有捕获变量的 lambda,需要根据 answer 的这些家伙生成动态代码。
基本上我认为必须动态生成的是这个。 (注意这里的代码表示我想要的语义而不是任何真正的代码)
UserData *userdata;
api_return_value callback(api_data arg) {
return customized_callback(arg, userdata);
}
我会生成这个,这样我就可以将动态生成的代码绑定到某个 api 中定义的相应函数指针回调
api_return_value (*callback) (api_data);
是否有一种使用 LLVM 或 NativeJIT 之类的相当干净且可移植的方法来解决这个问题?我一直在使用没有提供用户数据指针的 C api,所以这似乎是我唯一的选择。
【问题讨论】:
-
您可以控制
userdata指向的位置? IE。 C api 是否提供将用户上下文传递给回调? -
不,他们认为您只需要一个实例。我正在使用的 api 在这个头文件github.com/libretro/RetroArch/blob/master/libretro-common/… 中定义和记录,据我所知,没有一个 api 函数允许这种功能
-
您链接的文件有 2700 行。回调在哪里?它是如何通过的?它是如何相关的?请编辑问题以提供所有相关信息。所以无论如何你都要使用全局变量。那么是什么阻止您使用
std::function<api_return_value()> func_pointer并将 lambda 存储在其中?请发布示例代码。你到底想做什么?您发布的与 lambdas 相关的小代码是如何剪断的? -
糟糕的是,我写这篇文章的时候很着急。我尝试添加更多上下文。任何地方都没有编写 lambda 函数,因为我基本上打算在运行时手动生成我自己的函数,这就是问题的重点。
-
你有一个
c++标签(没有c标签),但你说你想要一个C API?那是什么意思?如果您真的想要 C(而不是 C++),请更改标签并使其清楚。如果你想要 C++,这就是std::function的用途——不需要 JIT 或其他任何东西。
标签: c++ lambda llvm function-pointers jit