折叠表达式
- 功能:以二元运算符对形参包进行解包
- 使用范围:任何下列 32 个二元运算符之一:
+ - * / % ^ & | = < > << >> += -= *= /= %= ^= &= |= <<= >>= == != <= >= && || , .* ->*
- 妙用:
- 使用逗号运算符向容器插入数据
- 注意事项:解包操作需放入
()
运算符中
- 示例
//一元左折叠 (... op E)
template<class ...Args>
bool l_fun(Args...args) {
return (... && args);
}
//一元右折叠 (E op ...)
template<class ...Args>
bool r_fun(Args...args) {
return (args && ... );
}
//二元左折叠 (E op ... op I)
template<typename ...Args>
int l_sum(Args&&... args) {
return ((1 * 2) + ... + args ); // OK
}
//二元右折叠 (E op ... op I)
template<typename ...Args>
int r_sum(Args&&... args) {
// return (args + ... + 1 * 2); // 错误:优先级低于转型的运算符
return (args + ... + (1 * 2)); // OK
}
int main() {
bool bl= l_fun(false, true, true);//((false&&true)&&true)
bool br=r_fun(false, true, true);//(false&&(true&&true))
}