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(</