7 Features of C++17 that will simplify your code
Open Source Your Knowledge, Become a Contributor
Technology knowledge has to be shared and made accessible for free. Join the movement.
Fold expressions
With C++11 we got variadic templates which is a great feature, especially if you want to work with a variable number of input parameters to a function. For example, previously (pre C++11) you had to write several different versions of a function (like one for one parameter, another for two parameters, another for three params... ).
Still, variadic templates required some additional code when you wanted to implement 'recursive' functions like sum
, all
. You had to specify rules for the recursion:
For example:
auto SumCpp11(){
return 0;
}
template<typename T1, typename... T>
auto SumCpp11(T1 s, T... ts){
return s + SumCpp11(ts...);
}
And with C++17 we can write much simpler code:
template<typename ...Args> auto sum(Args ...args)
{
return (args + ... + 0);
}
// or even:
template<typename ...Args> auto sum2(Args ...args)
{
return (args + ...);
}
Fold expressions over a parameter pack.
Expression | Expansion |
---|---|
(... op pack) | ((pack1 op pack2) op ...) op packN |
(init op ... op pack) | (((init op pack1) op pack2) op ...) op packN |
(pack op ...) | pack1 op (... op (packN-1 op packN)) |
(pack op ... op init) | pack1 op (... op (packN-1 op (packN op init))) |
Also by default we get the following values for empty parameter packs:
Operator | default value |
---|---|
&& | true |
|| | false |
, | void() |
Here's quite nice implementation of a printf
using folds P0036R0:
template<typename ...Args>
void FoldPrint(Args&&... args) {
(cout << ... << forward<Args>(args)) << '\n';
}
Or a fold over a comma operator:
template<typename T, typename... Args>
void push_back_vec(std::vector<T>& v, Args&&... args)
{
(v.push_back(args), ...);
}
In general, fold expression allows writing cleaner, shorter and probably easier to read code.
More details in:
- N4295 and P0036R0
- "Using fold expressions to simplify variadic function templates" in Modern C++ Programming Cookbook.
- Simon Brand: Exploding tuples with fold expressions
- Baptiste Wicht: C++17 Fold Expressions
- Fold Expressions - ModernesCpp.com
MSVC not yet, GCC: 6.0, Clang: 3.6 (N4295)/3.9(P0036R0).