Namensräume
Varianten
Aktionen

std::tuple

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
tuple
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
 
Definiert in der Header-Datei <tuple>
template< class... Types >
class tuple;
(seit C++11)

Die Klassenvorlage std::tuple ist eine Sammlung heterogener Werte fester Größe. Sie ist eine Verallgemeinerung von std::pair.

Wenn std::is_trivially_destructible<Ti>::value für jedes Ti in Types true ist, ist der Destruktor von std::tuple trivial.

Wenn ein Programm eine explizite oder partielle Spezialisierung von std::tuple deklariert, ist das Programm ill-formed (keine Diagnose erforderlich).

Inhalt

[bearbeiten] Template-Parameter

Types... - die Typen der Elemente, die das Tupel speichert. Eine leere Liste wird unterstützt.

[bearbeiten] Member-Funktionen

konstruiert ein neues tuple
(public member function) [bearbeiten]
weist den Inhalt eines tuple einem anderen zu
(public member function) [bearbeiten]
tauscht den Inhalt zweier tuples
(public member function) [bearbeiten]

[bearbeiten] Nicht-Member-Funktionen

erstellt ein tuple-Objekt vom Typ, der durch die Argumenttypen definiert ist
(function template) [bearbeiten]
(C++11)
erstellt ein Tupel aus Lvalue-Referenzen oder entpackt ein Tupel in einzelne Objekte
(Funktionsvorlage) [edit]
erstellt ein tuple aus Forwarding-Referenzen
(function template) [bearbeiten]
(C++11)
erstellt ein tuple durch Verkettung beliebig vieler Tupel
(function template) [bearbeiten]
greift auf ein Tupel-Element gemäß Spezifikation zu
(function template) [bearbeiten]
(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 Tupel lexikographisch
(function template) [bearbeiten]
spezialisiert den Algorithmus std::swap
(function template) [bearbeiten]

[bearbeiten] Hilfskonzepte

spezifiziert, dass ein Typ das Tupel-Protokoll implementiert
(std::get, std::tuple_element, std::tuple_size)
(nur zu Ausstellungszwecken*)[bearbeiten]

[bearbeiten] Hilfsklassen

ermittelt die Größe eines

tuple
(class template specialization) [bearbeiten]

ermittelt den Typ des spezifizierten Elements
(class template specialization) [bearbeiten]
spezialisiert das std::uses_allocator Typ-Trait
(class template specialization) [bearbeiten]
ermittelt den gemeinsamen Referenztyp eines tuple und eines tuple-like Typs
(class template specialization) [bearbeiten]
ermittelt den gemeinsamen Typ eines tuple und eines tuple-like Typs
(class template specialization) [bearbeiten]
Formatierungsunterstützung für tuple
(Klassenvorlagenspezialisierung) [edit]
Platzhalter zum Überspringen eines Elements beim Entpacken eines tuple mit tie
(constant) [bearbeiten]

[bearbeiten] Hilfsspezialisierungen

template< class... Ts >

constexpr bool enable_nonlocking_formatter_optimization<std::tuple<Ts...>>

 = (enable_nonlocking_formatter_optimization<Ts> && ...);
(seit C++23)

Diese Spezialisierung von std::enable_nonlocking_formatter_optimization ermöglicht eine effiziente Implementierung von std::print und std::println zum Drucken eines tuple-Objekts, wenn jeder Elementtyp dies zulässt.

[bearbeiten] Deduktions-Guides (seit C++17)

[bearbeiten] 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 zur Kompilierzeit verfügbar sein und können nur von anderen zur Kompilierzeit ausgewerteten Informationen abhängen. Das 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. Zum Beispiel ist es mit einem std::tuple<int, double, int> möglich, nach Typen zu filtern – z. B. die Rückgabe eines std::tuple<int, int> –, aber nicht danach zu filtern, ob jedes Element positiv ist (was eine andere Typsignatur abhängig 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 N4387 (angewendet als Fehlerbericht für C++11) konnte eine Funktion kein Tupel mit Copy-List-Initialisierung zurückgeben.

std::tuple<int, int> foo_tuple()
{
    return {1, -1};  // Error until N4387
    return std::tuple<int, int>{1, -1}; // Always works
    return std::make_tuple(1, -1); // Always works
}

[bearbeiten] 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

[bearbeiten] Fehlerberichte

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 2796 C++11 Die 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 ill-formed (keine Diagnose erforderlich).

[bearbeiten] Referenzen

  • C++23 Standard (ISO/IEC 14882:2024)
  • 22.4 Tuples [tuple]
  • C++20 Standard (ISO/IEC 14882:2020)
  • 20.5 Tuples [tuple]
  • C++17 Standard (ISO/IEC 14882:2017)
  • 23.5 Tuples [tuple]
  • C++14 Standard (ISO/IEC 14882:2014)
  • 20.4 Tuples [tuple]
  • C++11 Standard (ISO/IEC 14882:2011)
  • 20.4 Tuples [tuple]

[bearbeiten] Siehe auch

implementiert ein binäres Tupel, d. h. ein Paar von Werten
(Klassenvorlage) [edit]