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

被折叠的 条评论
为什么被折叠?



