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

lambda函数中的“捕获”变量解析为参数

潘泰
2023-03-14

对不起,我不知道这个问题的标题是什么。

我在C中有一个函数,它以λ作为参数。

void LoopPixels(cv::Mat &img, void(*fptr)(uchar &r, uchar &g, uchar &b)) {
    // ...
    fptr(r, g, b); // Call the lambda function
}

然后我尝试调用这个LoopPixels函数。

int threshold = 50;
LoopPixels(img, [](uchar &r, uchar &g, uchar &b) {
    r *= (uchar)threshold; // Unable to access threshold :(
});

我的问题是,我无法从lambda函数内部访问threshold变量,如果我试图用[

错误消息:

没有合适的转换函数"lambda[]space(uchar

如何访问已解析为函数参数的lambda中的变量?


共有2个答案

吕向荣
2023-03-14

您可以尝试使用以下方法

void LoopPixels(cv::Mat& img, uint& r, uint& g, uint& b, const std::function<void(uint& r, uint& g, uint& b)>& callback)
{
    callback(r, g, b);
}

cv::Mat img;
int threshold = 50;
uint r = 1;
uint g = 1;
uint b = 1;

std::cout << "(before) rgb : " << r << g << b << std::endl;

LoopPixels(img, r, g, b, [threshold](uint& r, uint& g, uint& b)
{
   r *= threshold;
   g *= threshold;
   b *= threshold;
});

std::cout << "(after) rgb : " << r << g << b << std::endl;

lamba捕获是按值传递的,因为引用可能在回调调用之前超出范围。

(我使用uint表示r、g、b变量,而不是uchar,因为将uchar乘以int可能不会得到预期的结果)。

有宏峻
2023-03-14

不能将捕获lambda传递给函数指针。必须将函数更改为使用std::function,或使用函数模板。

void LoopPixels1(cv::Mat &img, std::function<void(uchar &r, uchar &g, uchar &b)> fn);
// Or:
template<typename Callable>
void LoopPixels2(cv::Mat &img, Callable fn);

// Can be called with a capturing lambda
LoopPixels1(img, [threshold](uchar &r, uchar &g, uchar &b) { });
LoopPixels2(img, [threshold](uchar &r, uchar &g, uchar &b) { });
 类似资料:
  • 来自声明/功能/9.3.4.6/6.2(我很抱歉如何引用标准中的具体句子): 显式对象参数声明是带有this说明符的参数声明。显式对象参数声明只能作为参数声明列表的第一个参数声明出现:(6.1)声明成员函数的成员声明符([class.mem])或(6.2)lambda声明符([expr.prim.lambda])。 如果lambda表达式允许此作为显式对象参数,那么当我们同时捕获变量时会发生什么?

  • Windows 10、Visual Studio 2019、C 17: 编译错误:无法将参数2从“int(\u cdecl*)(int)”转换为“…” 如果没有模板(int func(int size)),代码编译正常。如何修改它以使编译器理解可变参数?

  • 这是一个相当基本的程序。当我尝试打印方法和方法时,我会出现错误,表示参数不能解析为变量。 公共类PizzaOutput{ 导入java.util.scanner; 公共类PizzaInput{Scanner键盘=新扫描器(System.in); } 公共级披萨订单{私人最终双份奶酪价格=2.40;

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

  • 问题内容: 我想做这样的事情: 并得到返回: 问题答案: 您不能那样做(正如Ignacio Vazquez-Abrams已经回答的那样),但是您可以通过类似的方式来做: 唯一的区别是您必须使用关键字参数,否则它将不起作用。 另一种解决方案是访问 传递的变量的属性,这将导致获得函数,类或名称的名称(或其他将定义此名称的名称)。您唯一应该知道的是,默认情况下,它不是变量的名称,而是函数/类/模块的原始

  • 问题 你用lambda定义了一个匿名函数,并想在定义时捕获到某些变量的值。 解决方案 先看下下面代码的效果: >>> x = 10 >>> a = lambda y: x + y >>> x = 20 >>> b = lambda y: x + y >>> 现在我问你,a(10)和b(10)返回的结果是什么?如果你认为结果是20和30,那么你就错了: >>> a(10) 30 >>> b(10)