cpp-fold expression

用来打包可变参数的

有四种语义

unary right fold (pack op …)
unary left fold (… op pack)
binary right fold (pack op … op init)
binary left fold (init op … op pack)
template<typename... Args>
auto sub_val_right(Args&&... args) {
return (args - ...);
}


template<typename... Args>
auto sub_val_left(Args&&... args) {
return (... - args);
}

auto t = sub_val_right(2,3,4); //(2-(3-4)) = 3
auto t1 = sub_val_left(2,3,4); //((2-3)-4) = -5
template<typename... Args>
auto sub_one_left(Args&&... args) {
return (1 - ... - args);
}

template<typename... Args>
auto sub_one_right(Args&&... args) {
return (args - ... - 1);
}

auto t = sub_one_left(234);// (((1-2)-3)-4) = -8
auto t1 = sub_one_right(234);//(2-(3-(4-1))) = 2