Spec-Zone.ru › C++

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);
}

См. также

is_array_type
(C++26)
проверяет, является ли отражённый тип типом массива
(функция)
remove_extent
(C++26)
удаляет одну границу из отражённого типа массива
(функция)
remove_all_extents
(C++26)
удаляет все границы из отражённого типа массива
(функция)
rank
(C++26)
получает количество измерений отражённого типа массива
(функция)
extents
(C++23)
дескриптор многомерного индексного пространства некоторого ранга
(шаблон класса)
extent
(C++11)
получает размер типа массива вдоль указанного измерения
(шаблон класса)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/meta/extent

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API