如何编写 Alias<T, N> 形式的别名来生成 std::tuple<T1, T2, ... TN>

问题描述 投票:0回答:1

示例:

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 的
std::tuple
,所以我认为不知何故,基本情况对于我的类模板
TypeRecursion
来说是错误的。但我不明白为什么。

c++
1个回答
0
投票

在 std::tuple_cat 的帮助下,您可以使用一行特征

template<class T, std::size_t N>
using Ts = decltype(std::tuple_cat(std::declval<std::array<T, N>>()));
© www.soinside.com 2019 - 2024. All rights reserved.