基础博客:https://blog.csdn.net/qq_35976351/article/details/106985750
折叠表达式同样是运行在编译期间的,先给出基本的规则:
注意,一元表达式只有&&
、||
或者,
有缺省值,三者空包的默认值分别是:true
、false
和void()
所有支持的运算符是:
+ - * / % ^ & | = < > << >> += -= *= /= %= ^= &= |= <<= >>= == != <= >= && || , .* ->*
给出一元折叠代码示例:
#include <iostream>
template <typename... Args>
auto SubOpRight(Args&&... args) {
return (args - ...);
}
template <typename... Args>
auto SubOpLeft(Args&&... args) {
return (... - args);
}
int main() {
// ([-1] - [-2]) - [-3] 4
auto lv = SubOpLeft(-1, -2, -3);
// [-1] - ([-2] - [-3]) -2
auto rv = SubOpRight(-1, -2, -3);
std::cout << lv << ", " << rv << std::endl;
return 0;
}
二元表达式,相当于有了初始值,代码示例:
#include <iostream>
template <typename... Args>
auto SubOp2Right(Args&&... args) {
return (args - ... - 1);
}
template <typename... Args>
auto SubOp2Left(Args&&... args) {
return (1 - ... - args);
}
int main() {
// ((1 - [-1]) - [-2])) - [-3] 7
auto lv = SubOp2Left(-1, -2, -3);
// [-1] - (([-2] - ([-3] - 1))) -3
auto rv = SubOp2Right(-1, -2, -3);
std::cout << lv << ", " << rv << std::endl;
return 0;
}