在C++11中引入了匿名函数,也就是所谓的lambda表达式;其实这个表达式在python、JAVA等语言中早就已经存在了,使用lambda表达式使代码开起来简洁。
但是凭我多年的开发经验看,很不建议大家使用这个表达式:原因是这种表达式一出现,很多人都是蒙圈的,不便于团队配合,不便于软件的后期维护,但是偏偏有一部分人喜欢使用,程序员的世界是不懂的,只能随他们去吧!!!
自己不写这类惹人蒙圈的东西,但是要能看的懂!
下面我用QT写了一个简单的例子,配置注释简单的记录一下,方便自己后期翻阅以及大家查阅。
#include <QCoreApplication>
#include <iostream>
using namespace std;
class test {
public:
void hello() {
cout << "test hello" << endl;
}
void lambda() {
auto fun = [this]{ //this是捕获的类对象test
this.hello(); //可以调用类对象的方法和属性
};
fun(); //执行上面定义的lambda函数fun
}
}
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
int x = 1;
int y = 2;
//用法1(-3.5作为参数f的值传入函数内部参与计算)
cout << [](float f) -> int {return std::abs(f);}(-3.5) << endl;
//用法2(=的作用是捕获main函数作用域中的x,y的值,作为参数传入函数内部参与计算)
cout << [=](){return x + y;}() << endl;
//用法3(显式的表名函数的返回类型)
cout << [=]() -> int {return x + y;}() << endl;
//用法4(作用域内的参数x,y,直接参数-3.5同时传入参数内部参与运算)
cout << [=](float f) -> int {return x + y + std::abs(f);}(-3.5) << endl;
//用法5(把lambda表达式函数赋值给类型相同的函数指针)
int(*add)(int, int) = [](int a, int b) -> int {return a + b;} << endl;
int ret = add(x, y);
cout << "ret=" << ret << endl;
//用法6(把lambda表达式函数赋值auto类型的变量,实际上是上面函数指针的简化版)
auto add1 = [](int a, int b) -> int {return a + b;} << endl;
ret = add1(x, y);
cout << "ret=" << ret << endl;
//用法7(不想写捕获类型时,可以直接写this,但是只针对类对象有效)
test t;
t.lambda();
return a.exec();
}
以下是捕获列表的说明
[] // 沒有定义任何变量。使用未定义变量会引发错误。
[x, &y] // x以传值方式传入(默认),y以引用方式传入。
[&] // 任何被使用到的外部变量都隐式地以引用方式加以引用。
[=] // 任何被使用到的外部变量都隐式地以传值方式加以引用。
[&, x] // x显式地以传值方式加以引用。其余变量以引用方式加以引用。
[=, &z] // z显式地以引用方式加以引用。其余变量以传值方式加以引用。
版权声明:本文为yhj_911原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。