Namensräume
Varianten
Aktionen

std::tuple_size

Von cppreference.com
< cpp‎ | utility
 
 
Dienstprogramm-Bibliotheken
Sprachunterstützung
Typunterstützung (Basistypen, RTTI)
Bibliotheks-Feature-Test-Makros (C++20)
Programm-Dienstprogramme
Variadische Funktionen
Coroutine-Unterstützung (C++20)
Vertragsunterstützung (C++26)
Drei-Wege-Vergleich
(C++20)
(C++20)(C++20)(C++20)  
(C++20)(C++20)(C++20)

Allgemeine Hilfsmittel
Relationale Operatoren (in C++20 veraltet)
Ganzzahl-Vergleichsfunktionen
(C++20)(C++20)(C++20)  
(C++20)
Swap und Typ-Operationen
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Gemeinsame Vokabulartypen
(C++11)
(C++17)
(C++17)
(C++17)
tuple_size
(C++11)
(C++17)
(C++23)



 
Definiert in der Header-Datei <array>
Definiert in der Header-Datei <tuple>
Definiert in der Header-Datei <utility>
Definiert in der Header-Datei <ranges>
(seit C++20)
Definiert in der Header-Datei <complex>
(seit C++26)
template< class T >
struct tuple_size; // nicht definiert
(1) (seit C++11)
template< class T >

struct tuple_size< const T >

    : std::integral_constant<std::size_t, std::tuple_size<T>::value> {};
(2) (seit C++11)
template< class T >

struct tuple_size< volatile T >

    : std::integral_constant<std::size_t, std::tuple_size<T>::value> {};
(3) (seit C++11)
(veraltet in C++20)
template< class T >

struct tuple_size< const volatile T >

    : std::integral_constant<std::size_t, std::tuple_size<T>::value> {};
(4) (seit C++11)
(veraltet in C++20)

Stellt den Zugriff auf die Anzahl der Elemente eines Tuple-ähnlichen Typs als konstanten Ausdruck zur Compile-Zeit bereit.

1) Die primäre Template ist nicht definiert. Eine explizite (volle) oder partielle Spezialisierung ist erforderlich, um einen Typ Tuple-ähnlich zu machen.
2-4) Spezialisierungen für cv-qualifizierte Typen verwenden standardmäßig den value aus den entsprechenden cv-unqualifizierten Versionen.

std::tuple_size interagiert mit der Kernsprache: Es kann Structured Binding-Unterstützung im Tuple-ähnlichen Fall bereitstellen.

(2-4) sind SFINAE-freundlich: Wenn std::tuple_size<T>::value als nicht ausgewerteter Operand fehlerhaft ist, stellen sie das Member value nicht bereit. Die Zugriffsprüfung wird so durchgeführt, als befände sie sich in einem Kontext, der unabhängig von tuple_size und T ist. Nur die Gültigkeit des unmittelbaren Kontexts des Ausdrucks wird berücksichtigt. Dies ermöglicht

#include <utility>
 
struct X { int a, b; };
const auto [x, y] = X(); // structured binding declaration first attempts
                         // tuple_size<const X> which attempts to use tuple_size<X>::value,
                         // then soft error encountered, binds to public data members
(seit C++17)

Inhalt

[bearbeiten] Spezialisierungen

Die Standardbibliothek stellt folgende Spezialisierungen für Typen der Standardbibliothek bereit

ermittelt die Größe eines

tuple
(class template specialization) [bearbeiten]

ermittelt die Größe eines pair
(Klassenvorlagenspezialisierung) [edit]
ermittelt die Größe eines arrays
(Klassentemplatenspezialisierung) [bearbeiten]
erhält die Größe eines std::ranges::subrange
(Klassentemplate-Spezialisierung) [bearbeiten]
erhält die Größe eines std::complex
(class template specialization) [edit]

Alle Spezialisierungen von std::tuple_size erfüllen UnaryTypeTrait mit der *Basischarakteristik* std::integral_constant<std::size_t, N> für ein gewisses N.

Benutzer können std::tuple_size für vom Programm definierte Typen spezialisieren, um sie Tuple-ähnlich zu machen. Vom Programm definierte Spezialisierungen müssen die obigen Anforderungen erfüllen.

Normalerweise müssen nur Spezialisierungen für cv-unqualifizierte Typen angepasst werden.

[bearbeiten] Hilfsvariablentemplate

Definiert in der Header-Datei <tuple>
template< class T >
constexpr std::size_t tuple_size_v = tuple_size<T>::value;
(seit C++17)

Abgeleitet von std::integral_constant

Member-Konstanten

value
[static]
für eine Standard-Spezialisierung die Anzahl der Elemente im Tuple-ähnlichen Typ T
(öffentliche statische Member-Konstante)

Memberfunktionen

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

Membertypen

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

[bearbeiten] Beispiel

#include <array>
#include <cstddef>
#include <ranges>
#include <tuple>
#include <utility>
 
template<class T, std::size_t Size> struct Arr { T data[Size]; };
 
// Program-defined specialization of std::tuple_size:
template<class T, std::size_t Size> struct std::tuple_size<Arr<T, Size>>
    : public integral_constant<std::size_t, Size> {};
 
int main()
{
    using tuple1 = std::tuple<int, char, double>;
    static_assert(3 == std::tuple_size_v<tuple1>); // uses using template (C++17)
 
    using array3x4 = std::array<std::array<int, 3>, 4>;
    static_assert(4 == std::tuple_size<array3x4>{}); // uses operator std::size_t
 
    using pair = std::pair<tuple1, array3x4>;
    static_assert(2 == std::tuple_size<pair>()); // uses operator()
 
    using sub = std::ranges::subrange<char*, char*>;
    static_assert(2 == std::tuple_size<sub>::value);
 
    using Arr5 = Arr<int, 5>;
    static_assert(5 == std::tuple_size_v<Arr5>);
}

[bearbeiten] Defect reports

Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
LWG 2212 C++11 Spezialisierungen für cv-Typen waren in einigen Headern nicht erforderlich, was zu Mehrdeutigkeiten führte Gefordert

[bearbeiten] Siehe auch

Strukturierte Bindung (C++17) bindet die angegebenen Namen an Unterobjekte oder Tuple-Elemente des Initialisierers[bearbeiten]
erhält die Elementtypen eines Tupel-ähnlichen Typs
(Klassenvorlage) [edit]
(C++11)
erstellt ein tuple durch Verkettung beliebig vieler Tupel
(function template) [bearbeiten]