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
Défini dans l'en-tête <type_traits>
template < class T, unsigned N = 0 >
struct extent ;
(depuis C++11)

Si T est un type tableau, fournit la constante membre value égale au nombre d'éléments le long de la N ième dimension du tableau, si N est dans l'intervalle [ 0 , std:: rank < T > :: value ) . Pour tout autre type, ou si T est un tableau de taille inconnue le long de sa première dimension et N vaut 0 , value vaut 0 .

Si le programme ajoute des spécialisations pour std::extent ou std::extent_v (depuis C++17) , le comportement est indéfini.

Table des matières

Modèle de variable d'assistance

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

Hérité de std:: integral_constant

Constantes membres

value
[static]
le nombre d'éléments le long de la N -ième dimension de T
(constante membre publique statique)

Fonctions membres

operator std::size_t
convertit l'objet en std:: size_t , retourne value
(fonction membre publique)
operator()
(C++14)
retourne value
(fonction membre publique)

Types membres

Type Définition
value_type std:: size_t
type std:: integral_constant < std:: size_t , value >

Implémentation possible

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

Exemple

#include <type_traits>
static_assert(
    std::extent_v<int[3]> == 3 && // la dimension par défaut est 0
    std::extent_v<int[3], 0> == 3 && // identique à ci-dessus
    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); // avec conversion implicite en std::size_t
    const int ints[]{1, 2, 3, 4};
    static_assert(std::extent_v<decltype(ints)> == 4); // taille du tableau
    [[maybe_unused]] int ary[][3] = {{1, 2, 3}};
    // ary[0] est de type référence vers 'int[3]', donc l'extent
    // ne peut pas être calculé correctement et retourne 0
    static_assert(std::is_same_v<decltype(ary[0]), int(&)[3]>);
    static_assert(std::extent_v<decltype(ary[0])> == 0);
    // supprimer la référence donne la valeur correcte de l'extent 3
    static_assert(std::extent_v<std::remove_cvref_t<decltype(ary[0])>> == 3);
}

Voir aussi

(C++11)
vérifie si un type est un type tableau
(modèle de classe)
(C++11)
obtient le nombre de dimensions d'un type tableau
(modèle de classe)
supprime une dimension du type tableau donné
(modèle de classe)
supprime toutes les dimensions du type tableau donné
(modèle de classe)
(C++23)
un descripteur d'un espace d'index multidimensionnel d'un certain rang
(modèle de classe)