栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++的匿名函数lambda表达式、lambda表达式捕获this

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++的匿名函数lambda表达式、lambda表达式捕获this

在C++11中引入了匿名函数,也就是所谓的lambda表达式;其实这个表达式在python、JAVA等语言中早就已经存在了,使用lambda表达式使代码开起来简洁。
但是凭我多年的开发经验看,很不建议大家使用这个表达式:原因是这种表达式一出现,很多人都是蒙圈的,不便于团队配合,不便于软件的后期维护,但是偏偏有一部分人喜欢使用,程序员的世界是不懂的,只能随他们去吧!!!
自己不写这类惹人蒙圈的东西,但是要能看的懂!
下面我用QT写了一个简单的例子,配置注释简单的记录一下,方便自己后期翻阅以及大家查阅。

#include 
#include 
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显式地以引用方式加以引用。其余变量以传值方式加以引用。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/979810.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号