std::meta::extent
Определён в заголовке <meta> | ||
|---|---|---|
consteval std::size_t extent( std::meta::info r, unsigned i = 0 ); | (начиная с C++26) |
Если r представляет тип массива, возвращает количество элементов вдоль i-го измерения массива, если i находится в диапазоне [0, std::meta::rank(r)). Для любого другого типа или если r представляет массив с неизвестной границей по первому измерению и i равно 0, возвращает 0.
Эквивалентно std::extent<T, I>::value, где T — тип, представленный std::meta::dealias(r), а I — константа, равная i.
Параметры
| r | - | значение отражения |
Возвращаемое значение
Количество элементов вдоль указанного измерения i, если r представляет тип массива и i находится в пределах диапазона ранга. В противном случае — 0.
Исключения
std::meta::exception, если r не представляет тип или псевдоним типа.
Пример
#include <meta>
static_assert
(""
&& extent(^^int[3]) == 3 // default dimension is 0
&& extent(^^int[3], 0) == 3 // dimension 0 has 3 elements
&& extent(^^int[3], 1) == 0 // dimension index is out of range
&& extent(^^int[3][4], 0) == 3
&& extent(^^int[3][4], 1) == 4
&& extent(^^int[3][4], 2) == 0 // dimension index is out of range
&& extent(^^int[]) == 0
);
int main()
{
const auto ext = extent(^^int[8]);
static_assert(ext == 8); // with implicit conversion to std::size_t
const int ints[]{1, 2, 3, 4};
static_assert(extent(^^decltype(ints)) == 4); // array size
[[maybe_unused]] int ary[][3] = { {1, 2, 3} };
// ary[0] is of type reference to int[3], so, the extent
// cannot be calculated correctly and it returns 0
static_assert(std::meta::is_same_type(^^decltype(ary[0]), ^^int(&)[3]));
static_assert(extent(^^decltype(ary[0])) == 0);
// removing reference gives correct extent value 3
static_assert(extent(std::meta::remove_cvref(^^decltype(ary[0]))) == 3);
}
См. также
|
(C++26) | проверяет, является ли отражённый тип типом массива (функция) |
|
(C++26) | удаляет одну границу из отражённого типа массива (функция) |
|
(C++26) | удаляет все границы из отражённого типа массива (функция) |
|
(C++26) | получает количество измерений отражённого типа массива (функция) |
|
(C++23) | дескриптор многомерного индексного пространства некоторого ранга (шаблон класса) |
|
(C++11) | получает размер типа массива вдоль указанного измерения (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/meta/extent