Пространства имён
Варианты
Действия

std::rank

Материал из cppreference.com
 
 
Библиотека метапрограммирования
Свойства типов
Категории типов
(C++11)
(C++14)  
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Свойства типов
(C++11)
(C++11)
(C++14)
(C++11)
(C++11)(до C++20*)
(C++11)(устарело в C++20)
(C++11)
Константы свойств типа
Метафункции
(C++17)
Поддерживаемые операции
Запросы отношений и свойств
Модификации типов
(C++11)(C++11)(C++11)
Преобразования типов
(C++11)(устарело в C++23)
(C++11)(устарело в C++23)
(C++11)
(C++11)
(C++17)

(C++11)(до C++20*)(C++17)
Рациональная арифметика времени компиляции
Целочисленные последовательности времени компиляции
 
<tbody> </tbody>
Определено в заголовочном файле <type_traits>
template< class T > struct rank;
(начиная с C++11)

Если T является типом массива, предоставляет константу-элемент value, равную количеству измерений массива. Для любого другого типа value равна 0.

Поведение программы, добавляющей специализации для std::rank или std::rank_v (начиная с C++17) не определено.

Вспомогательная шаблонная переменная

<tbody> </tbody>
template< class T > inline constexpr std::size_t rank_v = rank<T>::value;
(начиная с C++17)

Унаследован от std::integral_constant

Константы элементы

value
[static]
количество измерений 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>
struct rank : public std::integral_constant<std::size_t, 0> {};

template<class T>
struct rank<T[]> : public std::integral_constant<std::size_t, rank<T>::value + 1> {};

template<class T, std::size_t N>
struct rank<T[N]> : public std::integral_constant<std::size_t, rank<T>::value + 1> {};

Пример

#include <type_traits>

int main()
{
    static_assert(
        std::rank<int>{} == 0
     && std::rank<int[5]>{} == 1
     && std::rank<int[5][5]>{} == 2
     && std::rank<int[][5][5]>{} == 3 );

    [[maybe_unused]] int ary[][3]={{1,2,3}};
    // Количество измерений "ary[0]" вычисляется как 0
    static_assert(std::rank_v<decltype(ary[0])> == 0);
    // заключается в том, что rank не может иметь дело со ссылочным типом,
    // то есть int(&)[3]
    static_assert(std::is_same_v<decltype(ary[0]), int(&)[3]>);
    // Решение состоит в том, чтобы удалить ссылочный тип
    static_assert(std::rank_v<std::remove_cvref_t<decltype(ary[0])>> == 1);
}

Смотрите также

(C++11)
проверяет, является ли тип типом массива
(шаблон класса) [править]
(C++11)
получает размер типа массива по указанному измерению
(шаблон класса) [править]
удаляет одну размерность из данного типа массива
(шаблон класса) [править]
удаляет все измерения из данного типа массива
(шаблон класса) [править]