【发布时间】:2019-11-29 22:27:57
【问题描述】:
我现在正在学习 C++,对 Lambda 函数的语法很困惑
我想在一个单元的顶部定义 lambda,例如
typedef const std::function<void (bool)> bitloop;
或
typedef void bitloop(bool bit, int idx);
稍后,将 lambda 接受到类中的函数中,例如,在我的 Bits 类中,有一个方法 forEach
void forEach(const bitloop loop){
for (int i = 0; i<=fCount-1;i++){
loop(this->isSet(i),i);
}
}
然后终于可以在以后编写不同的循环函数,传递一个值和循环索引,这样我就可以在局部范围内捕获变量,例如
bits.forEach([&](bool on, int i){
output("index" + to_string(count)); //count is locally declared variable
});
如果我删除 &,它适用于第二种类型 def,但我无法捕获计数变量。
有人可以解释我在哪里出错了,如果这是一种有效的方法?
【问题讨论】:
-
“解释我哪里出错了” 出了什么问题?任何编译器错误?你能写一个minimal reproducible example 并逐字发布错误吗?
-
我不太明白这个问题。 Lambda 可以转换为
std::function或传递给模板函数。如果可能的话,后者通常是更好的选择, -
副本如何回答问题?? @1201ProgramAlarm
-
据我所知,您只是缺少函数签名的第二个参数:
std::function<void (bool)>->std::function<void (bool, int)>。函数类型 typedef 的第二种方法不起作用,因为带有捕获的 lambdas 不会衰减到函数指针。请注意,这两个 typedef 都不是 lambda 类型。每个 lambda 都有自己独特的类型。 -
@DerekSeymour 您需要逐字发布您在问题中收到的任何错误消息以及产生该错误消息的minimal reproducible example。 (点击
edit这样做)
标签: c++ lambda parameters