Docendo discimus.

Seneca the Younger.

I’m new to this topic since I literally just learned about the fold expressions today, and parameter packs days before that, so it will be a short post where I’ll explain the basics 🙂

Let’s jump straight to the code:

template
int sum(Args&&... args)
{
    return (args + ...);
}

Line 1 tells us there will be zero or more parameters.
Line 2 declares a function with said variable number of parameters.
Line 4 is where the magic happens. The fold expression states that for every parameter in the

args
parameter pack, combine it with the next one using
operator+
. So it becomes
args0 + args1 + ... + argsN
.

Another example:

template
inline void trace(Ts&&... args)
{
    (cout << ... << args) << endl;
}

Here in line 4 the fold expression takes the form of "(init op ... op pack)" as described by syntax #4 here. It expands to

cout << args0 << args1 << ... << argsN
.

Another way of doing the same is:

template
inline void trace(Ts&&... args)
{
    ((cout << args << " "),...) << endl;
}

Here the

cout << args << " "
is expanded N times, separated by the comma operator, so it's less efficient but we get a space between each printed argument.

That's it for now 🙂 I'll post more as I learn more!

Complete listing:

#include 
using namespace std;

template
int sum(Args&&... args)
{
    return (args + ...);
}

template
inline void trace(Ts&&... args)
{
    //(cout << ... << args) << endl;
    ((cout << args << " "),...) << endl;
}

int main(int argc, char** argv)
{
    trace(sum(1));
    trace(sum(1,2,3,4,5));
    trace(sum(1,1,2,3,5,8,13,21,34,55));
    trace(1, 2, 3);

    return 1;
}

Leave a Reply