I know I’m getting boring with currying, but I have finished most of what I originally wanted. And I am publishing the code this time. It is published under GPL.

Now, a curried function can be invoked with a single call, like a regular function; in two calls; or in as many calls as you wish - the only limit is the actual number of arguments. So, all of the following works:

f(1, 2, 3, 4, 5, 6)
f(1, 2, 3, 4, 5)(6)
f(1, 2, 3, 4)(5)(6)
f(1, 2)(3)(4)(5, 6)
f(1)(2)(3)(4)(5)(6)

On reddit, a very nice explanation of currying by m42a contained this piece of code:

template <class Func>
auto partially_apply_to_2(Func f)
{
    return uncurry(curry(f)(2));
}

It returns a new function that is same as f, but with the first argument set to 2. (see the post why this is more practical than std::bind). With the new version of curry.h, you don’t even need to uncurry the function, you can just do this:

return curry(f)(2);
// or:
return curry(f, c);

Here are a few documented examples of what you can do:

curry/main.cpp

And here is the header file: curry/curry.h

{% gist 6269914 %}