先看看一个例子,这个例子中有三个求和函数sum1,sum2,sum3.
auto sum1()
{
return 0;
}
template<typename T, typename...U>
auto sum1(T a, U... rest)
{
return a + sum1(rest...);
}
template<typename T,typename...U>
auto sum2(T a, U... rest)
{
if constexpr(sizeof...(rest)>0)
{
return a + sum2(rest...);
}
else
{
return a;
}
}
template<typename...U>
auto sum3(U... rest)
{
return (... + rest);
}
int main()
{
cout << sum1(1, 2, 3, 5.5, 6) << endl;
cout<<sum2(1, 2, 3, 5.5, 6) << endl;
cout << sum3(1, 2, 3, 5.5, 6) << endl;
system("pause");
return 0;
}
结果:
上述代码中sum3就使用了折叠表达式,可以看到代码非常简洁,却也实现了相同的功能。
折叠表达式是c++17标准引入的,引入折叠表达式的主要目的是计算某个值,这个值的特殊在于:它与所有可变参有关,而不是于单独某个参数有关。
折叠表达式一般有4种格式(注意每种格式都是用圆括号括起)。左折就是参数从左侧开始计算,右折就是参数从右侧开始计算。
格式:(… 运算符 一包参数)
计算方式:(((参数1 运算符 参数2)运算符 参数3))…运算符 参数N)
示例:
template<typename ...U>
auto sub_left(U...paras)
{
return (... - paras);
}
int main()
{
cout << sub_left(10, 20, 30, 40) << endl;
system("pause");
return 0;
}
结果:-80
一元右折格式:(一包参数 运算符 …)
计算方式:参数1 运算符(参数2…(参数N-1 运算符 参数N))
示例:
template<typename ...U>
auto sub_right(U...paras)
{
return (paras - ...);
}
int main()
{
cout << sub_right(10, 20, 30, 40) << endl;
system("pause");
return 0;
}
结果:-20
二元左折格式:(init 运算符 … 运算符 一包参数)
计算方式:(((init 运算符 参数1)运算符 参数2)…运算符 参数N)
示例:
template<typename ...U>
auto sub_left(U...paras)
{
return (220 - ... - paras);
}
int main()
{
cout << sub_left(10, 20, 30, 40) << endl;
system("pause");
return 0;
}
结果:120
((((220-10)-20)-30)-40)
格式:(一包参数 运算符 … 运算符 init)
计算方式:(参数1运算符(…(参数N 运算符 init))
示例:
template<typename ...U>
auto sub_right(U...paras)
{
return (paras - ... - 220);
}
int main()
{
cout << sub_right(10, 20, 30, 40) << endl;
system("pause");
return 0;
}
结果:200
10-(20-(30-(40-220)))=200
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)