Namespaces
Variants

std:: tuple

From cppreference.net
Utilities library
Défini dans l'en-tête <tuple>
template < class ... Types >
class tuple ;
(depuis C++11)

Le modèle de classe std::tuple est une collection de taille fixe de valeurs hétérogènes. Il s'agit d'une généralisation de std::pair .

Si std:: is_trivially_destructible < Ti > :: value est true pour chaque Ti dans Types , le destructeur de std::tuple est trivial.

Si un programme déclare une spécialisation explicite ou une spécialisation partielle de std::tuple , le programme est mal formé, aucun diagnostic requis.

Table des matières

Paramètres du modèle

Types... - les types des éléments que le tuple stocke. La liste vide est prise en charge.

Fonctions membres

construit un nouveau tuple
(fonction membre publique)
assigne le contenu d'un tuple à un autre
(fonction membre publique)
échange le contenu de deux tuple s
(fonction membre publique)

Fonctions non membres

(C++11)
crée un objet tuple du type défini par les types d'arguments
(modèle de fonction)
(C++11)
crée un tuple de références de lvalues ou décompose un tuple en objets individuels
(modèle de fonction)
crée un tuple de références de transfert
(modèle de fonction)
(C++11)
crée un tuple en concaténant n'importe quel nombre de tuples
(modèle de fonction)
accède à l'élément spécifié du tuple
(modèle de fonction)
(supprimé en C++20) (supprimé en C++20) (supprimé en C++20) (supprimé en C++20) (supprimé en C++20) (C++20)
compare lexicographiquement les valeurs dans le tuple
(modèle de fonction)
spécialise l'algorithme std::swap
(modèle de fonction)

Concepts auxiliaires

spécifie qu'un type implémente le protocole tuple
( std::get , std::tuple_element , std::tuple_size )
( concept d'exposition uniquement* )

Classes d'assistance

obtient la taille d'un

tuple
(spécialisation de modèle de classe)

obtient le type de l'élément spécifié
(spécialisation de modèle de classe)
spécialise le trait de type std::uses_allocator
(spécialisation de modèle de classe)
détermine le type de référence commun d'un tuple et d'un type tuple-like
(spécialisation de modèle de classe)
détermine le type commun d'un tuple et d'un type tuple-like
(spécialisation de modèle de classe)
support de formatage pour tuple
(spécialisation de modèle de classe)
(C++11)
espace réservé pour ignorer un élément lors du déballage d'un tuple en utilisant tie
(constante)

Spécialisations d'assistance

template < class ... Ts >

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

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

Cette spécialisation de std::enable_nonlocking_formatter_optimization permet une implémentation efficace de std::print et std::println pour l'affichage d'un objet tuple lorsque chaque type d'élément l'autorise.

Guides de déduction (depuis C++17)

Notes

Puisque la "forme" d'un tuple – sa taille, les types de ses éléments et l'ordre de ces types – fait partie de sa signature de type, elles doivent toutes être disponibles à la compilation et ne peuvent dépendre que d'autres informations disponibles à la compilation. Cela signifie que de nombreuses opérations conditionnelles sur les tuples – en particulier l'ajout conditionnel en tête/queue et le filtrage – ne sont possibles que si les conditions peuvent être évaluées à la compilation. Par exemple, étant donné un std :: tuple < int , double , int > , il est possible de filtrer sur les types – par exemple retourner un std :: tuple < int , int > – mais pas de filtrer sur le fait que chaque élément est positif ou non (ce qui aurait une signature de type différente selon les valeurs d'exécution du tuple), sauf si tous les éléments étaient eux-mêmes constexpr .

En guise de solution de contournement, on peut travailler avec des tuples de std:: optional , mais il n'existe toujours aucun moyen d'ajuster la taille en fonction des informations d'exécution.

Jusqu'à N4387 (appliqué comme rapport de défaut pour C++11), une fonction ne pouvait pas retourner un tuple en utilisant l'initialisation par liste de copie :

std::tuple<int, int> foo_tuple()
{
    return {1, -1};  // Erreur jusqu'à N4387
    return std::tuple<int, int>{1, -1}; // Fonctionne toujours
    return std::make_tuple(1, -1); // Fonctionne toujours
}

Exemple

#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';
}

Sortie :

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

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Appliqué à Comportement publié Comportement correct
LWG 2796 C++11 la trivialité du destructeur de std::tuple n'était pas spécifiée spécifiée
LWG 3990 C++11 un programme pouvait déclarer une spécialisation
explicite ou partielle de std::tuple
le programme est mal formé dans ce
cas (aucun diagnostic requis)

Références

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

Voir aussi

implémente un tuple binaire, c'est-à-dire une paire de valeurs
(modèle de classe)