# C++ 17 – Fold Expressions

**Parameter Pack** in C++ is denoted as “…”. When this is used in function as an argument along with template class, it can take a variable number of arguments of the same or different data types.

```
template <typename... Args>
auto product(Args... args) {
// body
}
```

With C++ 17, we can perform a binary operator on a parameter pack with a sequence of values using **fold expression**. **Fold expression** keeps it simple, and we do not have to write elaborate code to traverse the list to do the operation. It looks as below for the previous function.

`auto ret = args * ...;`

The above statement would calculate the product on all the values stored in **args**. The statement is called the Fold Expression.

Let us see a complete program using fold expression and the above product calculation in action. The program is available for download at https://github.com/codeversionmaster/cplusplus/blob/cplusplus17/fold_expr.cpp.

```
$ cat fold_expr.cpp
#include <iostream>
template <typename... Args>
auto calculate_product(Args... args) {
//Fold Expression that does "*" on all the values inside "args"
auto ret = (args * ...);
return ret;
}
int main() {
int product;
product = calculate_product(2, 3, 4, 5);
std::cout << "Product is " << product << std::endl;
product = calculate_product(2, 3, 4, 5, 6);
std::cout << "Product is " << product << std::endl;
return 0;
}
```

You can compile and run the program and see that a variable number of arguments are passed each time. The product is calculated with just one line of Fold Expression.

```
$ g++ -std=c++17 fold_expr.cpp -o fold_expr
$ ./fold_expr
Product is 120
Product is 720
```