跳转至

折叠表达式

  • 功能:以二元运算符对形参包进行解包
  • 使用范围:任何下列 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))
}