#include #include template std::function pa(const std::function &f, V1 v) { return [&](V2 x) { return f(v, x); }; } template std::function(V2)> curry(const std::function &f) { return [&](V2 x) { return pa(f, x); }; } template auto times(const Lhs &lhs, const Rhs &rhs) -> decltype(lhs * rhs) { return lhs * rhs; } int main() { std::function itimes = times; printf("pa: %d\n", pa(itimes, 10)(20)); printf("curry: %d\n", curry(itimes)(10)(20)); }