对不起,我不知道这个问题的标题是什么。
我在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中的变量?
您可以尝试使用以下方法:
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可能不会得到预期的结果)。
不能将捕获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)