获取多维可变参数 std::array 的根类型

pes*_*uww 3 c++ stdarray

我嵌套了 std::array,其维度由模板参数 std::array<type, n, ...> 处理。

我想知道如何在 std::array<std::array<int, 2>, 2> 中获得 int 类型。

在这种情况下,我们可以只做 std::array<std::array<int, 2>, 2>::value_type::value_type,但是我如何才能做到这一点而不必放置与维度一样多的 value_types?

Vit*_*meo 6

您可以使用基本的递归技术:

template <typename T>
struct nested_value_type { using type = T; };

template <typename T, std::size_t N>
struct nested_value_type<std::array<T, N>>
{
    using type = typename nested_value_type<T>::type;
};
Run Code Online (Sandbox Code Playgroud)

为方便起见,提供别名模板:

template <typename T>
using nested_value_type_t = typename nested_value_type<T>::type;
Run Code Online (Sandbox Code Playgroud)

瞧:

static_assert(std::is_same_v<
    nested_value_type_t<std::array<int, 1>>,
    int
>);

static_assert(std::is_same_v<
    nested_value_type_t<std::array<std::array<float, 1>, 1>>,
    float
>);

static_assert(std::is_same_v<
    nested_value_type_t<std::array<std::array<std::array<char, 1>, 1>, 1>>,
    char
>);
Run Code Online (Sandbox Code Playgroud)

Godbolt.org 上的现场示例


C++20 的短一点std::type_identity

template <typename T>
struct nested_value_type : std::type_identity<T> { };

template <typename T>
using nested_value_type_t = typename nested_value_type<T>::type;

template <typename T, std::size_t N>
struct nested_value_type<std::array<T, N>> 
    : std::type_identity<nested_value_type_t<T>> { };
Run Code Online (Sandbox Code Playgroud)