std:: rank
From cppreference.net
C++
Metaprogramming library
| Type traits | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Compile-time rational arithmetic | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Compile-time integer sequences | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
(C++14)
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Definido en el encabezado
<type_traits>
|
||
|
template
<
class
T
>
struct rank ; |
(desde C++11) | |
Si
T
es un tipo array, proporciona la constante miembro
value
igual al número de dimensiones del array. Para cualquier otro tipo,
value
es
0
.
Si el programa añade especializaciones para
std::rank
o
std::rank_v
(desde C++17)
, el comportamiento no está definido.
Contenidos |
Plantilla de variable auxiliar
|
template
<
class
T
>
constexpr std:: size_t rank_v = rank < T > :: value ; |
(desde C++17) | |
Heredado de std:: integral_constant
Constantes miembro
|
value
[static]
|
el número de dimensiones de
T
o cero
(constante miembro pública estática) |
Funciones miembro
|
operator std::size_t
|
convierte el objeto a
std::
size_t
, devuelve
value
(función miembro pública) |
|
operator()
(C++14)
|
devuelve
value
(función miembro pública) |
Tipos miembro
| Tipo | Definición |
value_type
|
std:: size_t |
type
|
std:: integral_constant < std:: size_t , value > |
Implementación posible
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> {}; |
Ejemplo
Ejecutar este código
#include <type_traits> static_assert(std::rank<int>{} == 0); static_assert(std::rank<int[5]>{} == 1); static_assert(std::rank<int[5][5]>{} == 2); static_assert(std::rank<int[][5][5]>{} == 3); int main() { [[maybe_unused]] int ary[][3] = {{1, 2, 3}}; // El rango del tipo referencia, ej., ary[0], que es int(&)[3], es 0: static_assert(std::rank_v<decltype(ary[0])> == 0); static_assert(std::is_same_v<decltype(ary[0]), int(&)[3]>); // La solución es eliminar el tipo referencia. static_assert(std::rank_v<std::remove_cvref_t<decltype(ary[0])>> == 1); }
Véase también
|
(C++11)
|
comprueba si un tipo es un tipo array
(class template) |
|
(C++11)
|
obtiene el tamaño de un tipo array a lo largo de una dimensión especificada
(class template) |
|
(C++11)
|
elimina una extensión del tipo array dado
(class template) |
|
(C++11)
|
elimina todas las extensiones del tipo array dado
(class template) |