Well, that was fun. Here is my solution:
namespace details { template <size_t N, class F = size_t()> struct Function_type_helper {}; template <size_t N, class... Args> struct Function_type_helper<N, size_t(Args...)> { using Type = typename Function_type_helper<N - 1, size_t(Args..., size_t)>::Type; }; template <class... Args> struct Function_type_helper<0, size_t(Args...)> { using Type = size_t(Args...); }; template <size_t N, class F = size_t()> using Function_type_helper_t = typename Function_type_helper<N, F>::Type; static_assert(std::is_same_v<Function_type_helper_t<3>, size_t(size_t, size_t, size_t)>); }
This works by recursively creating the type size_t(size_t, size_t, ..., size_t)
For example:
H<3>::Type == H<3, size_t()>::Type == H<2, size_t(size_t)>::Type == H<1, size_t(size_t, size_t)>::Type == H<0, size_t(size_t, size_t, size_t)>::Type == size_t(size_t, size_t, size_t)
bolov
source share