#include <functional>
#include <type_traits>

constexpr int ParametersCountLimit = 100;

template <typename Head, typename ... Tail>
struct helper
{
	using guard = typename std::enable_if<sizeof...(Tail) < ParametersCountLimit>::type;
	using next = helper<Head, Tail..., Head>;
	using fn = Head(Head, Tail...);
};

template <typename T, int N>
struct generator
{
	using helper_type = typename generator<T, N-1>::helper_type::next;
	using type = typename helper_type::fn;
};

template <typename T>
struct generator<T,2>
{
	using helper_type = helper<T, T>;
	using type = typename helper_type::fn;
};

template <class T>
class TD;

int main()
{
	TD< generator<int,99>::type > d;
	return 0;
}
