我有一个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表达式获取函数指针?有什么方法可以回避吗?
以下是我在想的:也许我不能通过从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
在某些情况下,这将是一个潜在的解决办法,但遗憾的是,在矿山中却不是。
如果您不能更改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 表达式,必