【发布时间】:2018-01-03 23:39:16
【问题描述】:
我有一个 C 语言函数要调用:
f_api(void(*callback)(int))
我有一个用于回调的静态类方法:
struct A {
static void CallBack(int i) {
A::count = i;
}
static count = 0;
};
我可以这样调用函数:
f_api(&A::CallBack)
但是,我现在必须将回调更改为非静态,因为我必须创建多个 A 对象。
但我无法更改f_api() 的定义。
我尝试使用 lambda:
f_api([this](int i)->void{this->count = i;})`
但这失败了,因为我无法将带有捕获的 lambda 转换为简单的函数指针。
std::bind() 也无法完成这项工作,因为 f_api() 定义。
我可以为此做些什么?如何从 lambda 表达式中获取函数指针?有什么方法可以回避吗?
【问题讨论】:
-
你已经排除了 lambda 作为解决方案,那你为什么还要问它呢?无论如何,API 是否允许您将用户定义的值传递给回调?如果是这样,那么使用它来传递您的
this指针。否则,您就是 SOL,而无需使用低级 thunk。 -
您无能为力。没有用于从成员函数指针形成常规函数指针的标准工具。如果您无法更改回调 API,您将别无选择,只能以某种方式通过常规函数路由回调。
-
@SilvioMayolo 这有点不同。我发布了一个可能对其他人有帮助的解决方案,尽管它对我没有用。
-
如果你真的想要任何方法将 lambdas(尤其是捕获数据的闭包)转换为原始函数指针,我编写了一个小库来实现这一点。请注意,这不是生产质量代码;这只是我的一个小实验,看看你的问题是否可以解决。另请注意,我的实现仅适用于 Linux 和 OS X,但如果您想要适用于 Windows 的东西,一般的想法就在那里。 github.com/MonaTheMonad/c2fp