C++ 如何从lambda表达式中获取函数指针?

C++ 如何从lambda表达式中获取函数指针?,c++,c++11,lambda,C++,C++11,Lambda,我有一个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()的定义 我试过使用la

我有一个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表达式中获取函数指针?有什么方法可以回避吗?

如果您不能更改C API,那么我认为您对这种情况无能为力。因为C函数需要所有它们需要的信息作为函数参数传入

可以使用以下命令将lambda转换为函数指针

void (*ptr) () = []() {}
没有任何捕获的lambda可以隐式转换为函数指针。但是捕获值的lambda不能转换为函数指针,因为它们有额外的状态(以成员变量的形式)

在C中解决此问题的常用方法是使用
void*
参数。看看
pthread\u create
函数。线程启动函数接受一个带有
void*
参数的函数,该参数指向“上下文”。这种情况下的上下文可能类似于您正在调用方法的实例


但是如果您不能更改C API,那么我担心您在函数指针方面做不了太多。您唯一能做的就是将变量设置为全局变量,然后使用这些变量在函数指针中调用这些方法

以下是我的想法: 也许我不能通过从lambda获取函数指针来实现这一点。但我做了一些其他的滴答来避免这个问题

template<unsigned int ClassCount>
struct A {
    static void CallBack(int i) {
        A::count = i;
    }
    static int count;
};

template<unsigned int ClassCount>
int A<ClassCount>::count = 0;
模板
结构A{
静态无效回调(inti){
A::计数=i;
}
静态整数计数;
};
模板
int A::count=0;
因此,我可以:

f_api(&A<0>::CallBack);
std::cout << A<0>::count << std::endl;
f_api(&A<1>::CallBack);
std::cout << A<1>::count << std::endl; // A<0>::count is different from A<1>::count
f_api(&A::回调);

std::您是否已经排除了lambda作为解决方案的可能性,那么您为什么还要再次询问它?在任何情况下,API是否允许您将用户定义的值传递给回调?如果是这样,那么使用它来传递
指针。否则,你就不需要使用低级的重击就可以了。你无能为力。没有标准工具可以从成员函数指针形成常规函数指针。如果您不能更改回调API,您将别无选择,只能通过常规函数路由回调。@SilvioMayolo有点不同。。我发布了一个可能对其他人有帮助的解决方案,尽管它对我没有用处。如果你真的想用任何方法将lambda(尤其是捕获数据的闭包)转换成原始函数指针,我编写了一个小型库来实现这一点。请注意,这不是生产质量代码;这只是我的一个小实验,看看你的问题是否可以解决。还要注意的是,我的实现仅适用于Linux和OS X,但如果您想在Windows上使用某些东西,一般的想法是存在的。“使变量成为全局变量”,并使用互斥锁或类似工具保护这些变量