Без рекурсии, с двумя объявленными (не определенными) вспомогательными функциями и using
template <typename T, std::size_t ... Is>
constexpr auto gft_helper (std::index_sequence<Is...> const &)
-> decltype(std::make_tuple( ((void)Is, std::declval<T>())... ));
template <typename T, std::size_t N>
constexpr auto get_fixed_tuple ()
-> decltype(gft_helper<T>(std::make_index_sequence<N>{}));
template <typename T, std::size_t N>
using tuple_fixed_type = decltype(get_fixed_tuple<T, N>());
Ниже приводится полный рабочий пример
#include <tuple>
#include <utility>
template <typename T, std::size_t ... Is>
constexpr auto gft_helper (std::index_sequence<Is...> const &)
-> decltype(std::make_tuple( ((void)Is, std::declval<T>())... ));
template <typename T, std::size_t N>
constexpr auto get_fixed_tuple ()
-> decltype(gft_helper<T>(std::make_index_sequence<N>{}));
template <typename T, std::size_t N>
using tuple_fixed_type = decltype(get_fixed_tuple<T, N>());
int main()
{
auto ft = tuple_fixed_type<long, 3u>{};
static_assert( std::is_same<decltype(ft), std::tuple<long, long, long>>{} );
}