std::tuple_size
| 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 > |
(2) | (seit C++11) |
| template< class T > struct tuple_size< volatile T > |
(3) | (seit C++11) (veraltet in C++20) |
| template< class T > struct tuple_size< const volatile T > |
(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.
|
(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 #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
| (C++11) |
ermittelt die Größe eines
|
| (C++11) |
ermittelt die Größe eines pair(Klassenvorlagenspezialisierung) |
| (C++11) |
ermittelt die Größe eines arrays(Klassentemplatenspezialisierung) |
| erhält die Größe eines std::ranges::subrange (Klassentemplate-Spezialisierung) | |
| erhält die Größe eines std::complex (class template specialization) |
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 |
| (C++11) |
erhält die Elementtypen eines Tupel-ähnlichen Typs (Klassenvorlage) |
| (C++11) |
erstellt ein tuple durch Verkettung beliebig vieler Tupel(function template) |