一概述:
折叠表达式,Fold Expressions,C++17
目的:计算某个值(表达式的结果当然是一个值)
该值得特殊性在于:它与所有可变参有关,而不是与单独某个可变参有关。需要所有可变参都参与计算,才能求出该值。
分类:
折叠表达式有四种格式:一元左折、一元右折,二元左折、二元右折。
注意,每种格式的折叠表达式都需要用圆括号括住。
左折:就是参数从左侧开始计算
右折:参数从右侧开始计算
二:范例
2.1:一元右折
#include<iostream>
using namespace std;
template <typename... T>
auto val(T... args)
{
//格式: (一包参数 运算符 ...)
return (args - ...); //一元右折,圆括号不能省略,否则出现编译错误
}
int main(int argc, char* argv[])
{
//计算方式:( 参数1 运算符 ( ... (参数N-1 运算符 参数N)))
auto sum = val(1, 2, 6); //一元右折(unary right fold)
//(1-(2-6))
std::cout << sum << std::endl; //5
return 0;
}
2.2:一元左折
#include<iostream>
using namespace std;
template <typename... T>
auto val(T... args)
{
return (... - args); //圆括号不能省略,否则出现编译错误,一元左折
}
int main(int argc, char* argv[])
{
//一元左折(unary left fold)
//格式: (... 运算符 一包参数)
//计算方式:((( 参数1 运算符 参数2) 运算符 参数3)....运算符 参数N)
//((1-2)-6)
auto sum = val(1, 2, 6);
std::cout << sum << std::endl; //-7
return 0;
}
#include<iostream>
using namespace std;
void print(int i)
{
std::cout << i << ' ';
}
template <typename... T>
void func(const T&... args)
{
//(print(args), ...);
(..., print(args));
std::cout << '\n';
}
int main()
{
func(1, 2, 3);
}
2.3:二元右折
二元右折(binary right fold)
格式:(一包参数 运算符 … 运算符 init)
计算方式:(参数1 运算符 (…(参数N 运算符 init )))
#include<iostream>
template <typename... Ts>
auto sum(Ts... ts)
{
//操作对象有两个,一个是0,一个是ts,
//...位于右边,所以为二元右折
return (ts + ... + 0);
}
int main()
{
sum();
}
2.4:二元左折
二元左折(binary left fold)
格式:(init 运算符 … 运算符 一包参数)
计算方式:(((init 运算符 参数1) 运算符 参数2) … 运算符 参数N)
init表示 一个初始的东西,它可能是一个值,也可能是个其他东西。
#include<iostream>
using namespace std;
template <typename... Ts>
auto sum(Ts... ts)
{
//操作对象有两个,一个是0,一个是ts,
//...位于左边,所以为二元左折
return (0+ ... + ts);
}
int main()
{
sum();
}