Fold Expression

It simplifies operations over template parameter packs

Types of Fold Expressions

Unary left fold
Ellipses on left side of argument
Binary left fold
Has initial value. Ellipses on left side of argument
Unary right fold
Ellipses on right side of argument
Binary right fold
Ellipses on right side of argument

// (... + args);  = 0+arg1+arg2+..
template <class ... T>
int sum(T ... v) {
    return (... + v);
}
int main() {
    sum (1,2,3);        //6
}
                    

// (3 + ... + args);  = 3+arg1+arg2+..
template <class ... T>
int sum(T ... v) {
    return (3 + ... + v);
}
int main() {
    sum (1,2,3);        //9
}
                    

// (v + ...);  = arg1+arg2+0
template <class ... T>
int sum(T ... v) {
    return (v + ...);
}
int main() {
    sum (1,2,3);        //9
}
                    

// (v + ... + 5);  = arg1+arg2+5
template <class ... T>
int sum(T ... v) {
    return (v + ... + 5);
}
int main() {
    sum (1,2,3);        //11
}