std::rank
Материал из cppreference.com
<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) |
получает размер типа массива по указанному измерению (шаблон класса) |
(C++11) |
удаляет одну размерность из данного типа массива (шаблон класса) |
(C++11) |
удаляет все измерения из данного типа массива (шаблон класса) |