Namespaces
Variants

std:: tuple

From cppreference.net
Utilities library
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)
erstellt ein tuple aus Forwarding-Referenzen
(Funktions-Template)
(C++11)
erstellt ein tuple durch Verkettung beliebig vieler tuples
(Funktions-Template)
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)
spezialisiert den std::swap -Algorithmus
(Funktions-Template)

Hilfskonzepte

spezifiziert, dass ein Typ das Tupel-Protokoll implementiert
( std::get , std::tuple_element , std::tuple_size )
( Nur-Darstellungs-Konzept* )

Hilfsklassen

ermittelt die Größe von

einem tuple
(Klassen-Template-Spezialisierung)

ermittelt den Typ des angegebenen Elements
(Klassen-Template-Spezialisierung)
spezialisiert den std::uses_allocator Type Trait
(Klassen-Template-Spezialisierung)
bestimmt den gemeinsamen Referenztyp eines tuple und eines tuple-like Typs
(Klassen-Template-Spezialisierung)
bestimmt den gemeinsamen Typ eines tuple und eines tuple-like Typs
(Klassen-Template-Spezialisierung)
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... >>

= ( 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 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)