# std::extent

< cpp‎ | types

定义于头文件 `<type_traits>` |  |
template< class T, unsigned N = 0> struct extent; |  | (C++11 起)

若 `T` 是数组类型，则提供等于数组第 `N` 维元素数量的成员常量 `value` ，若 `N` 在 `[0, std::rank<T>::value)` 中。对于任何其他类型，或若 `T` 是在其首维度未知边界数组且 `N` 为 0 ，则 `value` 为 0 。

添加 `extent` 或 `extent_v` (C++17 起) 的特化的程序行为未定义。

### 辅助变量模板

template< class T, unsigned N = 0 > inline constexpr std::size_t extent_v = extent<T, N>::value; |  | (C++17 起)

## 继承自 std::integral_constant

### 成员常量

value [静态] | `T` 的第 `N` 维的元素数 (公开静态成员常量)

### 成员函数

operator std::size_t | 转换对象为 std::size_t ，返回 `value` (公开成员函数)
operator() (C++14) | 返回 `value` (公开成员函数)

### 成员类型

类型 | 定义
`value_type` | `std::size_t`
`type` | std::integral_constant<std::size_t, value>

### 可能的实现

    template<class T, unsigned N = 0>
    struct extent : std::integral_constant<std::size_t, 0> {};

    template<class T>
    struct extent<T[], 0> : std::integral_constant<std::size_t, 0> {};

    template<class T, unsigned N>
    struct extent<T[], N> : std::extent<T, N-1> {};

    template<class T, std::size_t I>
    struct extent<T[I], 0> : std::integral_constant<std::size_t, I> {};

    template<class T, std::size_t I, unsigned N>
    struct extent<T[I], N> : std::extent<T, N-1> {};

### 示例

    #include <iostream>
    #include <type_traits>

    int main()
    {
        std::cout << std::extent<int[3]>::value << '\n'; // < 默认维度为 0
        std::cout << std::extent<int[3][4], 0>::value << '\n';
        std::cout << std::extent<int[3][4], 1>::value << '\n';
        std::cout << std::extent<int[3][4], 2>::value << '\n';
        std::cout << std::extent<int[]>::value << '\n';

        const auto ext = std::extent<int[9]>{};
        std::cout << ext << '\n'; // < 隐式转换到 std::size_t

        const int ints[] = {1,2,3,4};
        std::cout << std::extent<decltype(ints)>::value << '\n'; // < 数组大小
    }

输出：

    3
    3
    4
    0
    0
    9
    4

### 参阅

is_array (C++11) | 检查类型是否是数组类型 (类模板)
rank (C++11) | 获取数组类型的维数 (类模板)
remove_extent (C++11) | 从给定数组类型移除一个维度 (类模板)
remove_all_extents (C++11) | 移除给定数组类型的所有维度 (类模板)