Namespaces
Variants

std:: extent

From cppreference.net
Metaprogramming library
Type traits
Type categories
(C++11)
(C++11) ( DR* )
Type properties
(C++11)
(C++11)
(C++14)
(C++11) (deprecated in C++26)
(C++11) ( until C++20* )
(C++11) (deprecated in C++20)
(C++11)
Type trait constants
Metafunctions
(C++17)
Supported operations
Relationships and property queries
Type modifications
Type transformations
(C++11) (deprecated in C++23)
(C++11) (deprecated in C++23)
(C++11)
(C++11) ( until C++20* ) (C++17)

Compile-time rational arithmetic
Compile-time integer sequences
Definido en el encabezado <type_traits>
template < class T, unsigned N = 0 >
struct extent ;
(desde C++11)

Si T es un tipo de arreglo, proporciona la constante miembro value igual al número de elementos a lo largo de la N ésima dimensión del arreglo, si N está en [ 0 , std:: rank < T > :: value ) . Para cualquier otro tipo, o si T es un arreglo de límite desconocido a lo largo de su primera dimensión y N es 0 , value es 0 .

Si el programa añade especializaciones para std::extent o std::extent_v (desde C++17) , el comportamiento no está definido.

Contenidos

Plantilla de variable auxiliar

template < class T, unsigned N = 0 >
constexpr std:: size_t extent_v = extent < T, N > :: value ;
(desde C++17)

Heredado de std:: integral_constant

Constantes miembro

value
[static]
el número de elementos a lo largo de la N -ésima dimensión de T
(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, unsigned N = 0>
struct extent : std::integral_constant<std::size_t, 0> {};
template<class T>
struct extent<T[], 0> : std::integral_constant<std::size_t, 0> {};
template<class T, unsigned N>
struct extent<T[], N> : std::extent<T, N - 1> {};
template<class T, std::size_t I>
struct extent<T[I], 0> : std::integral_constant<std::size_t, I> {};
template<class T, std::size_t I, unsigned N>
struct extent<T[I], N> : std::extent<T, N - 1> {};

Ejemplo

#include <type_traits>
static_assert(
    std::extent_v<int[3]> == 3 && // la dimensión por defecto es 0
    std::extent_v<int[3], 0> == 3 && // lo mismo que arriba
    std::extent_v<int[3][4], 0> == 3 &&
    std::extent_v<int[3][4], 1> == 4 &&
    std::extent_v<int[3][4], 2> == 0 &&
    std::extent_v<int[]> == 0
);
int main()
{
    const auto ext = std::extent<int['*']>{};
    static_assert(ext == 42); // con conversión implícita a std::size_t
    const int ints[]{1, 2, 3, 4};
    static_assert(std::extent_v<decltype(ints)> == 4); // tamaño del array
    [[maybe_unused]] int ary[][3] = {{1, 2, 3}};
    // ary[0] es de tipo referencia a 'int[3]', por lo tanto, la extensión
    // no puede calcularse correctamente y devuelve 0
    static_assert(std::is_same_v<decltype(ary[0]), int(&)[3]>);
    static_assert(std::extent_v<decltype(ary[0])> == 0);
    // eliminar la referencia da el valor de extensión correcto 3
    static_assert(std::extent_v<std::remove_cvref_t<decltype(ary[0])>> == 3);
}

Véase también

(C++11)
comprueba si un tipo es un tipo de arreglo
(plantilla de clase)
(C++11)
obtiene el número de dimensiones de un tipo de arreglo
(plantilla de clase)
elimina una extensión del tipo de arreglo dado
(plantilla de clase)
elimina todas las extensiones del tipo de arreglo dado
(plantilla de clase)
(C++23)
un descriptor de un espacio de índices multidimensional de algún rango
(plantilla de clase)