#include <iostream>
#include <functional>

// Manual function definitions.
    std::function<double(double)> plus2(double a){
        return[a](double b){return a + b; };
    }
    
    auto plus3(double a) {
        return [a](double b){ return plus2(a + b); };
    }

// -----

// Automatic function definitions.
    template<int N>
    auto plus(double a);
    
    template<int N>
    auto plus(double a) {
        return [a](double b){ return plus<N - 1>(a + b); };
    }
    
    template<>
    auto plus<1>(double a) {
        return a;
    }
    
// -----

int main() {
	std::cout << "Manual:\n"
			  << plus2(1)(2)    << ' '
			  << plus3(1)(2)(3) << '\n'
			  << "\nTemplate:\n"
			  << plus<2>(1)(2)          << ' '
			  << plus<3>(1)(2)(3)       << ' '
			  << plus<4>(1)(2)(3)(4)    << ' '
			  << plus<5>(1)(2)(3)(4)(5) << '\n';
}