std:: tuple
|
Definiert im Header
<tuple>
|
||
|
template
<
class
...
Types
>
class tuple ; |
(seit C++11) | |
Klassentemplate
std::tuple
ist eine feste Sammlung heterogener Werte. Es ist eine Verallgemeinerung von
std::pair
.
Wenn
std::
is_trivially_destructible
<
Ti
>
::
value
für jeden
Ti
in
Types
true
ist, dann ist der Destruktor von
std::tuple
trivial.
Wenn ein Programm eine
explizite
oder
partielle
Spezialisierung von
std::tuple
deklariert, ist das Programm fehlerhaft, keine Diagnose erforderlich.
Inhaltsverzeichnis |
Template-Parameter
| Typen... | - | die Typen der Elemente, die das Tupel speichert. Leere Liste wird unterstützt. |
Memberfunktionen
konstruiert ein neues
tuple
(öffentliche Elementfunktion) |
|
weist die Inhalte eines
tuple
einem anderen zu
(öffentliche Elementfunktion) |
|
tauscht die Inhalte zweier
tuple
s
(öffentliche Elementfunktion) |
Nicht-Member-Funktionen
|
(C++11)
|
erstellt ein
tuple
-Objekt des durch die Argumenttypen definierten Typs
(Funktions-Template) |
|
(C++11)
|
erstellt ein
tuple
aus Lvalue-Referenzen oder entpackt ein tuple in einzelne Objekte
(Funktions-Template) |
|
(C++11)
|
erstellt ein
tuple
aus
Forwarding-Referenzen
(Funktions-Template) |
|
(C++11)
|
erstellt ein
tuple
durch Verkettung beliebig vieler tuples
(Funktions-Template) |
|
(C++11)
|
greift auf das angegebene Element des tuples zu
(Funktions-Template) |
|
(entfernt in C++20)
(entfernt in C++20)
(entfernt in C++20)
(entfernt in C++20)
(entfernt in C++20)
(C++20)
|
vergleicht die Werte im tuple lexikografisch
(Funktions-Template) |
|
(C++11)
|
spezialisiert den
std::swap
-Algorithmus
(Funktions-Template) |
Hilfskonzepte
|
(C++23)
|
spezifiziert, dass ein Typ das
Tupel-Protokoll
implementiert
( std::get , std::tuple_element , std::tuple_size ) ( Nur-Darstellungs-Konzept* ) |
Hilfsklassen
|
(C++11)
|
ermittelt die Größe von
einem
|
|
(C++11)
|
ermittelt den Typ des angegebenen Elements
(Klassen-Template-Spezialisierung) |
|
(C++11)
|
spezialisiert den
std::uses_allocator
Type Trait
(Klassen-Template-Spezialisierung) |
bestimmt den gemeinsamen Referenztyp eines
tuple
und eines
tuple-like
Typs
(Klassen-Template-Spezialisierung) |
|
|
(C++23)
|
bestimmt den gemeinsamen Typ eines
tuple
und eines
tuple-like
Typs
(Klassen-Template-Spezialisierung) |
|
(C++23)
|
Formatierungsunterstützung für
tuple
(Klassen-Template-Spezialisierung) |
|
(C++11)
|
Platzhalter zum Überspringen eines Elements beim Entpacken eines
tuple
mit
tie
(Konstante) |
Helfer-Spezialisierungen
|
template
<
class
...
Ts
>
constexpr
bool
enable_nonlocking_formatter_optimization
<
std
::
tuple
<
Ts...
>>
|
(seit C++23) | |
Diese Spezialisierung von
std::enable_nonlocking_formatter_optimization
ermöglicht eine effiziente Implementierung von
std::print
und
std::println
für die Ausgabe eines
tuple
-Objekts, wenn jeder Elementtyp dies ermöglicht.
Deduktionsleitfäden (seit C++17)
Hinweise
Da die "Form" eines Tupels – seine Größe, die Typen seiner Elemente und die Reihenfolge dieser Typen – Teil seiner Typsignatur ist, müssen alle diese Informationen zur Kompilierzeit verfügbar sein und können nur von anderen Kompilierzeitinformationen abhängen. Dies bedeutet, dass viele bedingte Operationen auf Tupeln – insbesondere bedingtes Voranstellen/Anhängen und Filtern – nur möglich sind, wenn die Bedingungen zur Kompilierzeit ausgewertet werden können. Beispielsweise ist es bei einem std :: tuple < int , double , int > möglich, nach Typen zu filtern – z.B. durch Rückgabe eines std :: tuple < int , int > – aber nicht danach, ob jedes Element positiv ist (was eine unterschiedliche Typsignatur in Abhängigkeit von Laufzeitwerten des Tupels hätte), es sei denn, alle Elemente wären selbst constexpr .
Als Workaround kann man mit Tupeln von std:: optional arbeiten, aber es gibt immer noch keine Möglichkeit, die Größe basierend auf Laufzeitinformationen anzupassen.
Bis zu N4387 (angewendet als Fehlerbericht für C++11), konnte eine Funktion kein Tuple mittels Copy-List-Initialisierung zurückgeben:
std::tuple<int, int> foo_tuple() { return {1, -1}; // Fehler bis N4387 return std::tuple<int, int>{1, -1}; // Funktioniert immer return std::make_tuple(1, -1); // Funktioniert immer }
Beispiel
#include <iostream> #include <stdexcept> #include <string> #include <tuple> std::tuple<double, char, std::string> get_student(int id) { switch (id) { case 0: return {3.8, 'A', "Lisa Simpson"}; case 1: return {2.9, 'C', "Milhouse Van Houten"}; case 2: return {1.7, 'D', "Ralph Wiggum"}; case 3: return {0.6, 'F', "Bart Simpson"}; } throw std::invalid_argument("id"); } int main() { const auto student0 = get_student(0); std::cout << "ID: 0, " << "GPA: " << std::get<0>(student0) << ", " << "grade: " << std::get<1>(student0) << ", " << "name: " << std::get<2>(student0) << '\n'; const auto student1 = get_student(1); std::cout << "ID: 1, " << "GPA: " << std::get<double>(student1) << ", " << "grade: " << std::get<char>(student1) << ", " << "name: " << std::get<std::string>(student1) << '\n'; double gpa2; char grade2; std::string name2; std::tie(gpa2, grade2, name2) = get_student(2); std::cout << "ID: 2, " << "GPA: " << gpa2 << ", " << "grade: " << grade2 << ", " << "name: " << name2 << '\n'; // C++17 structured binding: const auto [gpa3, grade3, name3] = get_student(3); std::cout << "ID: 3, " << "GPA: " << gpa3 << ", " << "grade: " << grade3 << ", " << "name: " << name3 << '\n'; }
Ausgabe:
ID: 0, GPA: 3.8, grade: A, name: Lisa Simpson ID: 1, GPA: 2.9, grade: C, name: Milhouse Van Houten ID: 2, GPA: 1.7, grade: D, name: Ralph Wiggum ID: 3, GPA: 0.6, grade: F, name: Bart Simpson
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrektes Verhalten |
|---|---|---|---|
| LWG 2796 | C++11 |
Trivialität des Destruktors von
std::tuple
war nicht spezifiziert
|
spezifiziert |
| LWG 3990 | C++11 |
ein Programm konnte eine explizite oder
partielle Spezialisierung von
std::tuple
deklarieren
|
das Programm ist in diesem
Fall fehlerhaft (keine Diagnose erforderlich) |
Referenzen
- C++23 Standard (ISO/IEC 14882:2024):
-
- 22.4 Tupel [tuple]
- C++20-Standard (ISO/IEC 14882:2020):
-
- 20.5 Tupel [tuple]
- C++17-Standard (ISO/IEC 14882:2017):
-
- 23.5 Tupel [tuple]
- C++14-Standard (ISO/IEC 14882:2014):
-
- 20.4 Tupel [tuple]
- C++11 Standard (ISO/IEC 14882:2011):
-
- 20.4 Tupel [tuple]
Siehe auch
|
implementiert binäres Tupel, d.h. ein Wertepaar
(Klassentemplate) |