c++ - 如何从 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()的定义。

我尝试使用 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_create 函数。线程启动函数接受带有指向“上下文”的 void* 参数的函数。在您的情况下,此上下文可以类似于您调用方法的实例。

但如果你不能改变 C API,那么恐怕你在函数指针方面也无能为力。您唯一可以做的就是使变量成为全局变量,然后使用它们来调用函数指针中的那些方法。

关于c++ - 如何从 lambda 表达式中获取函数指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45364382/

相关文章:

c++ - Rcpp 移动平均 - 边界错误导致 fatal error

c++ - OpenGL Programming Guild 第八版,示例程序和 'NumVAOs'

c++ - Gcc 预处理器和粘贴

c++ - std::vector.pop_back() 会改变 vector 的容量吗?

c++ - 避免在用户定义的模板特化中重复

c++ - std::enable_if 在 Visual Studio 2013 中没有按预期工作

Java 8 Lambda Collectors.summingLong 多列?

c++ - 一种在 C++ 中读取二进制文件的 Kosher 方法

java - 根据条件声明最终变量并在 java 的 lambda 中使用它

使用 lambda 和 std::function 的 C++11 类型推断