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
Definiert im Header <type_traits>
template < class T, unsigned N = 0 >
struct extent ;
(seit C++11)

Falls T ein Array-Typ ist, liefert die Member-Konstante value die Anzahl der Elemente entlang der N ten Dimension des Arrays, sofern N im Bereich [ 0 , std:: rank < T > :: value ) liegt. Für jeden anderen Typ oder falls T ein Array mit unbekannter Größe in seiner ersten Dimension ist und N gleich 0 ist, ist value gleich 0 .

Falls das Programm Spezialisierungen für std::extent oder std::extent_v (since C++17) hinzufügt, ist das Verhalten undefiniert.

Inhaltsverzeichnis

Hilfsvariablen-Template

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

Geerbt von std:: integral_constant

Elementkonstanten

value
[static]
die Anzahl der Elemente entlang der N -ten Dimension von T
(öffentliche statische Elementkonstante)

Elementfunktionen

operator std::size_t
konvertiert das Objekt zu std:: size_t , gibt value zurück
(öffentliche Elementfunktion)
operator()
(C++14)
gibt value zurück
(öffentliche Elementfunktion)

Elementtypen

Typ Definition
value_type std:: size_t
type std:: integral_constant < std:: size_t , value >

Mögliche Implementierung

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> {};
**Hinweis:** Der gesamte Code innerhalb der `
`-Tags wurde gemäß den Anforderungen nicht übersetzt, da es sich um C++-Code handelt. Die HTML-Struktur und Attribute bleiben ebenfalls unverändert.

Beispiel

#include <type_traits>
static_assert(
    std::extent_v<int[3]> == 3 && // Standarddimension ist 0
    std::extent_v<int[3], 0> == 3 && // dasselbe wie oben
    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); // mit impliziter Konvertierung zu std::size_t
    const int ints[]{1, 2, 3, 4};
    static_assert(std::extent_v<decltype(ints)> == 4); // Arraygröße
    [[maybe_unused]] int ary[][3] = {{1, 2, 3}};
    // ary[0] ist vom Typ Referenz auf 'int[3]', daher kann die Ausdehnung
    // nicht korrekt berechnet werden und gibt 0 zurück
    static_assert(std::is_same_v<decltype(ary[0]), int(&)[3]>);
    static_assert(std::extent_v<decltype(ary[0])> == 0);
    // Entfernen der Referenz liefert den korrekten Ausdehnungswert 3
    static_assert(std::extent_v<std::remove_cvref_t<decltype(ary[0])>> == 3);
}

Siehe auch

(C++11)
prüft, ob ein Typ ein Array-Typ ist
(Klassentemplate)
(C++11)
ermittelt die Anzahl der Dimensionen eines Array-Typs
(Klassentemplate)
entfernt eine Dimension vom gegebenen Array-Typ
(Klassentemplate)
entfernt alle Dimensionen vom gegebenen Array-Typ
(Klassentemplate)
(C++23)
ein Deskriptor eines mehrdimensionalen Indexraums mit einem bestimmten Rang
(Klassentemplate)