Пример: Ts<int, 5> ints; //decltype(ints) = std::tuple<int, int, int, int, int>
Другой пример: Ts<std::string, 3> strs; //decltype(strs) = std::tuple<std::string, std::string, std::string>;
Я попытался написать этот код для достижения этой цели:
namespace detail {
template<typename Tuple, typename TupleElem, size_t N>
struct TypeRecursion {
using Type = std::conditional_t<
std::tuple_size_v<Tuple> == N,
Tuple,
typename TypeRecursion<decltype(std::tuple_cat(Tuple{}, std::tuple<TupleElem>{})), TupleElem, N>::Type
>;
};
}
template<typename T, size_t N>
using Ts = typename detail::TypeRecursion<std::tuple<T>, T, N>::Type;
Но MSVC выдает мне ошибку: recursive type or function dependency too complex. Я посмотрел на выходные данные компилятора, и всякий раз, когда я пытался ввести Ts<T, N>, он пытался получить std::tuple из миллиона T, поэтому я думаю, что базовый случай почему-то неверен для моего шаблона класса TypeRecursion. Хотя я не понимаю, почему.





Вы можете просто std::tuple_catstd::array:
template<class T, std::size_t N>
using Ts = decltype(std::tuple_cat(std::declval<std::array<T, N>>()));
Следует отметить, что такое поведение не гарантировано до C++23. До этого реализациям разрешалось реализовывать такое поведение, но если они этого не сделали, то это UB.
Дюп: Как создать список типов (для шаблонов с переменным числом типов), содержащий n-кратное количество одного и того же типа?