C++17 关键新特性介绍及代码讲解 (6) — fold expression
一句话概括:
fold expression 是将 parameter pack 进行递归展开、并通过二元操作符 (binary operator) 进行运算的一种表达式。
parameter pack 包括: template parameter pack、 function parameter pack, 以下面代码中的函数声明为例,
typename ... Args
为 template parameter pack, Args... args
为 function parameter pack:
template <typename ... Args>
constexpr auto unary_right_sub(Args... args);
fold expression 的详细定义参见 [fold expression]
parameter pack 的详细定义参见 [parameter pack]
在 C++17 中,总共定义有四种类型的 fold expression, 我们结合例子来看一下:
1. unary right fold
语法:
( E op … )
扩展为
( E1 op ( … op ( EN-1 op EN ) ) )
E 的定义 :一个包含未展开的 parameter pack 的表达式;如上文定义的,parameter pack 可以是 template parameter pack 或者
function parameter pack;
op: 即二元操作符,且可以被重载,包括:
+ - * / % ^ & | ~ = < > << >> += -= *= /= %= ^= &= |= <<= >>= == != <= >= && || , .* ->*
N:parameter pack 中包含的元素个数;
在后文将要介绍到的另外三种类型 fold expression 的定义中,E 和 op 的定义与这里相同,不再赘述;
我们通过下面这段代码,来看看 unary right fold 是怎么展开的:
/*** 1. unary right fold ***/
template <typename ... Args>
constexpr auto unary_right_sub(Args... args){
return (args - ...); // unary right fold expression.
}
/*** test unary right fold ***/
constexpr auto u_r_sub = unary_right_sub(1, 2, 3, 4);
static_assert(u_r_sub == (1 - (2 - (3 - 4)))