std:: tuple
|
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) |
|
(C++11)
|
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) |
|
(C++11)
|
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) |
|
(C++11)
|
spécialise l'algorithme
std::swap
(modèle de fonction) |
Concepts auxiliaires
|
(C++23)
|
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
|
(C++11)
|
obtient la taille d'un
|
|
(C++11)
|
obtient le type de l'élément spécifié
(spécialisation de modèle de classe) |
|
(C++11)
|
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) |
|
|
(C++23)
|
détermine le type commun d'un
tuple
et d'un type
tuple-like
(spécialisation de modèle de classe) |
|
(C++23)
|
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...
>>
|
(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) |