示例:
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
。我查看了编译器输出,每当我尝试输入 Tsstd::tuple
,所以我认为不知何故,基本情况对于我的类模板 TypeRecursion
来说是错误的。但我不明白为什么。
在 std::tuple_cat 的帮助下,您可以使用一行特征
template<class T, std::size_t N>
using Ts = decltype(std::tuple_cat(std::declval<std::array<T, N>>()));