std::extent
Материал из cppreference.com
| Defined in header <type_traits>
|
||
| template< class T, unsigned N = 0> struct extent; |
(начиная с C++11) | |
Если T является типом массива, то предоставляет константу-член value, которая будет равна количеству элементов в N-ом измерении массива, если N входит в интервал [0, std::rank<T>::value). Для всех остальных типов или, если T является массивом с неизвестными границами для его первого измерения и N равно 0, то она равна 0.
Содержание |
[править] Вспомогательная шаблонная переменная
| template< class T, unsigned N = 0 > constexpr std::size_t extent_v = extent<T, N>::value; |
(начиная с C++17) | |
Унаследован от std::integral_constant
Константы-члены
| value [static] |
Количество элементов в N-ом измерении T (public static константа-член) |
Функции-члены
| operator std::size_t |
Преобразует объект в std::size_t, возвращается value (public функция-член) |
| operator() (C++14) |
Возвращает value (public функция-член) |
Типы-члены
| Тип | Определение |
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::integral_constant<std::size_t, std::extent<T, N-1>::value> {}; template<class T, std::size_t N> struct extent<T[N], 0> : std::integral_constant<std::size_t, N> {}; template<class T, std::size_t I, unsigned N> struct extent<T[I], N> : std::integral_constant<std::size_t, std::extent<T, N-1>::value> {}; |
[править] Пример
Запустить этот код
#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
[править] См. также
| (C++11) |
Проверяет является ли тип типом массива или нет (шаблон класса) |
| (C++11) |
Получает число измерений массива (шаблон класса) |
| (C++11) |
Удаляет одно измерение от данного типа массива (шаблон класса) |
| (C++11) |
Удаляет все измерения от данного типа массива (шаблон класса) |
| (library fundamentals TS) |
Шаблонная переменная, являющая псевдонимом для std::extent::value (шаблонная переменная) |

