#include <iostream>
#include <functional>

int add(int a, int b)
{
    return a + b;
}

template <typename T1, typename T2, typename T3>
    std::function<T1(T3)> curry(std::function<T1(T2, T3)> f, T2 a)
{
    return [=](T3 b) -> T1 { return f(a, b); };
}

template <typename T1, typename T2, typename T3>
    inline std::function<T1(T3)> curry(T1(*f)(T2, T3), T2 a)
{
    return curry(std::function<T1(T2, T3)>(f), a);
}

int main()
{
    std::function<int(int)> add1 = curry(add, 1);
    std::cout << add1(2) << std::endl;
}
