当前位置: 首页 > 知识库问答 >
问题:

如何从lambda表达式中获取函数指针?[副本]

扶杜吟
2023-03-14

我有一个C语言函数要调用

f_api(void(*callback)(int))

我有一个回调的静态类方法:

struct A {
    static void CallBack(int i) {
        A::count = i;
    }
    static count = 0;
};

我可以这样调用函数:

f_api(&A::CallBack)

但是,我现在必须将回调改为非静态,因为我必须创建多个< code>A对象。

但是我不能更改< code>f_api()的定义。

我尝试使用lambda:

f_api([this](int i)->void{this->count = i;})`

但是这失败了,因为我不能把一个带有capture的lambda转换成一个简单的函数指针。

std::bind()也不能做这项工作,因为f_api()定义。

我能做什么?如何从lambda表达式获取函数指针?有什么方法可以回避吗?

共有2个答案

毋举
2023-03-14

以下是我在想的:也许我不能通过从lambda获取函数指针来做到这一点。但是我做了一些其他的滴答声,让多A来回避这个问题......

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;

这样我就可以:

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

在某些情况下,这将是一个潜在的解决办法,但遗憾的是,在矿山中却不是。

周奇文
2023-03-14

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

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

void (*ptr) () = []() {}

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

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

但是,如果您无法更改C API,那么恐怕您就无法对函数指针做很多事情。您唯一能做的就是使变量成为全局变量,然后使用这些变量在函数指针中调用这些方法。

 类似资料:
  • 我正在尝试使用lambda函数来快速测试,但我在使用它时遇到了困难。我不知道为什么事情没有像(我觉得)应该的那样工作。 这与我预期的一样: 然而,这并没有: 给出错误: 错误:没有合适的转换函数从" lambda []double(double S)- 我不明白为什么在捕获列表中添加一些内容会改变这里的情况。我对C语言中的lambdas还比较陌生,所以可能在某个地方犯了一个愚蠢的错误。。。 我需要

  • 上面的代码是我的功能接口。 下面的代码是我的lambda表达式。函数接口在我的lambda表达式中做什么,因为只有一个简单的'double'?如果没有功能接口,会是什么样子?

  • 目前我学习Springboot。 在这个代码中 我知道这是lambda表达式,但我没有得到原始代码。这不是我的代码。你能让我知道原始代码吗?

  • 指针是算术表达式、赋值表达式和比较表达式中的有效操作数。但是,通常并不是这些表达式中使用的所有运算符都在指针变量中有效。本节介绍可以用指针操作数的运算符及这些运算符的用法。 只有少量操作可以对指针进行。指针可以自增(++)或自减(--),整数可以加进指针中(+或+=),也可以从指针中减去整数(-或-=),指针可以减去另一指针。 假设声明了数组 int v[5] ,其第一个元素位于内存地址 3000

  • 问题内容: 如何使用带闭包的Java 8编写的方法支持以函数为参数并将函数返回为值的方法? 问题答案: 在Java Lambda API中,主要类是java.util.function.Function。 您可以以与其他所有引用相同的方式使用对该接口的引用:将其创建为变量,然后将其作为计算结果返回,依此类推。 这是一个非常简单的示例,可能会对您有所帮助: 如果需要传递多于1个参数,请看一下方法,但

  • 对于定义一个简单的函数, Python 还提供了另外一种方法,即使用本节介绍的 lambda 表达式。 lambda 表达式,又称 匿名函数,常用来表示内部仅包含 1 行表达式的函数。如果一个函数的函数体仅有 1 行表达式,则该函数就可以用 lambda 表达式来代替。 lambda 表达式的语法格式如下: name = lambda [list] : 表达式 其中,定义 lambda 表达式,必