C++11-lambda表达式

本文介绍了C++11中的可变模板参数和lambda表达式。可变模板参数允许处理任意数量的参数,通过递归展开和逗号表达式来操作参数包。lambda表达式简化了代码,提供了匿名函数的功能,可以用于排序、交换等操作,并可以通过不同的捕捉列表灵活捕获外部变量。文中详细解释了lambda的语法和捕捉列表的用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

可变模板参数

C++11中新增加了可变模板参数,它对参数进行了高度泛化,它能表示0到任意个数、任意类型的参数。相比C++98/03,类模版和函数模版中只能含固定数量的模版参数,可变模版参数无疑是一个巨大的改进。掌握可变模板参数的基本使用即可。

一个基本的可变模板参数

template<class ...Args >

void ShowList(Args ...args)
{
   }

Args是一个模板参数包,args是一个函数形参参数包,声明一个参数包Args...args,参数包中可以包含0到任意个模板参数。我们无法直接获取参数包args中的每个参数的,只能通过展开参数包的方式来获取参数包中的每个参数,这是使用可变模版参数的一个主要特点。难点是展开参数包。

递归展开参数包

//递归终止函数
void ShowList()
{
   }
//多增加1个模板参数
template<class T,class ...Args>
void ShowList(T val,Args ...args)
{
   
	cout << val << endl;
	ShowList(args...);//递归调用自己
}
int main()
{
   
	ShowList(1, 1.1, 'A',"lambda");
	return 0;
}

多增加1个模板参数,让第1个模板参数来推参数包,再继续递归调用自己
在这里插入图片描述

逗号表达式展开参数包

template <class T>
void PrintArg(T t) 
{
   
	cout << t << " ";
}
//展开函数
template <class ...Args>
void ShowList(Args... args) 
{
   
	//{(printarg(args), 0)...}将会展开成((printarg(arg1),0),
	//(printarg(arg2), 0), (printarg(arg3), 0), etc... )
	//最终会创建一个元素值都为0的数组int arr[sizeof...(Args)]。
	int arr[] = {
    (PrintArg(args), 0)... };
	cout << endl;
}

由于是逗号表达式,在创建数组的过程中会先执行逗号表达式前面的部分printarg(args)
打印出参数,也就是说在构造int数组的过程中就将参数包展开了,这个数组的目的纯粹是为了在
数组构造的过程展开参数包。可以搞1个函数来获取参数包里的参数。下面是打印出来的效果。
在这里插入图片描述

lamdda表达式

C++98中的例子:

	vector<int> v = {
    5,1,7,12,33,28 };
	sort(v.begin(), v.end(</
评论 33
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_End丶断弦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值