Liaisons structurées
Fait partie de la section Programmation Orientée Objet du Journey C++ de Coddy. Leçon 88 sur 104.
Les liaisons structurées, introduites en C++17, vous permettent de décomposer plusieurs valeurs provenant de tableaux, de paires, de tuples ou de structures en variables nommées individuelles dans une seule déclaration. Cela rend le code plus clair et plus lisible lorsque vous travaillez avec des données composites.
La syntaxe utilise auto avec des crochets contenant les nouveaux noms de variables :
#include <iostream>
#include <map>
#include <tuple>
int main() {
// Déballage d'une paire
std::pair<std::string, int> person{"Alice", 25};
auto [name, age] = person;
std::cout << name << " is " << age << "\n";
// Déballage d'un tuple
std::tuple<int, double, char> data{42, 3.14, 'X'};
auto [num, pi, letter] = data;
// Déballage dans les boucles for basées sur une plage
std::map<std::string, int> scores{{"Bob", 90}, {"Carol", 85}};
for (const auto& [student, score] : scores) {
std::cout << student << ": " << score << "\n";
}
}Les liaisons structurées fonctionnent également avec les tableaux et les structures personnalisées qui possèdent des membres publics :
struct Point {
double x;
double y;
};
Point getOrigin() { return {0.0, 0.0}; }
int main() {
auto [x, y] = getOrigin();
int arr[3] = {1, 2, 3};
auto [a, b, c] = arr;
}Vous pouvez utiliser auto& ou const auto& pour lier par référence, éviter les copies et permettre la modification des valeurs d’origine lorsque cela est nécessaire. Cette fonctionnalité est particulièrement utile lors de l’itération sur des conteneurs STL ou de la gestion de fonctions qui renvoient plusieurs valeurs.
Défi
FacileConstruisons un analyseur de notes d'étudiants qui met en évidence la puissance des liaisons structurées. Vous allez créer un système qui traite les dossiers des étudiants et les données des cours, en utilisant des liaisons structurées pour décomposer élégamment les paires, les tuples et les structures tout au long de votre code.
Vous organiserez votre code sur trois fichiers :
Student.h: Définissez une structureStudentavec des membres publics pour le nom de l'étudiant (std::string), son identifiant (int) et sa moyenne GPA (double). Créez également une fonction appeléecreateStudentqui prend un nom, un identifiant et une moyenne GPA, puis renvoie une structureStudent.GradeUtils.h: Créez des fonctions utilitaires pour le traitement des notes.Définissez une fonction
getGradeInfoqui prend une note numérique (entier) et renvoie unstd::tuplecontenant trois valeurs : la note sous forme de lettre (std::string), les points de la note (double) et l'indication de réussite (bool). Utilisez cette échelle de notation :- 90+ : "A", 4.0, true
- 80-89 : "B", 3.0, true
- 70-79 : "C", 2.0, true
- 60-69 : "D", 1.0, true
- Moins de 60 : "F", 0.0, false
Définissez également une fonction
makeScorePairqui prend un nom de cours (std::string) et une note (int), et renvoie unestd::paircontenant ces valeurs.main.cpp: Lisez quatre entrées :- Nom de l'étudiant (chaîne)
- Identifiant de l'étudiant (entier)
- Nom du cours (chaîne)
- Note (entier)
Utilisez des liaisons structurées dans toute votre fonction principale :
- Appelez
createStudentavec le nom, l'identifiant et une moyenne GPA temporaire de 0.0. Utilisez des liaisons structurées pour décomposer la structure renvoyée en variables individuelles, puis affichez :Student: [name] (ID: [id]) - Appelez
makeScorePairavec le nom du cours et la note. Utilisez des liaisons structurées pour décomposer la paire, puis affichez :Course: [course], Score: [score] - Appelez
getGradeInfoavec la note. Utilisez des liaisons structurées pour décomposer les trois éléments du tuple, puis affichez :(Affichez "yes" si la réussite vaut true, et "no" si elle vaut false.)Grade: [letter] Points: [points] Passing: [yes/no]
Par exemple, avec les entrées Alice, 1001, Math et 85 :
Student: Alice (ID: 1001)
Course: Math, Score: 85
Grade: B
Points: 3
Passing: yesAvec les entrées Bob, 2002, Physics et 55 :
Student: Bob (ID: 2002)
Course: Physics, Score: 55
Grade: F
Points: 0
Passing: noN'oubliez pas d'inclure <tuple> et <utility> lorsque cela est nécessaire. L'idée essentielle est de comprendre comment les liaisons structurées vous permettent de décomposer des types composites, des paires, des tuples et des structures en variables nommées dans une seule déclaration lisible.
Essayez vous-même
#include <iostream>
#include <string>
#include "Student.h"
#include "GradeUtils.h"
int main() {
// Lire les entrées
std::string studentName;
int studentId;
std::string courseName;
int score;
std::cin >> studentName;
std::cin >> studentId;
std::cin >> courseName;
std::cin >> score;
// TODO: Appeler createStudent avec name, id, et un GPA placeholder de 0.0
// Utiliser les liaisons structurées pour dépaqueter la struct : auto [name, id, gpa] = ...
// Afficher : Student: [name] (ID: [id])
// TODO: Appeler makeScorePair avec le nom du cours et score
// Utiliser les liaisons structurées pour dépaqueter la pair : auto [course, sc] = ...
// Afficher : Course: [course], Score: [score]
// TODO: Appeler getGradeInfo avec le score
// Utiliser les liaisons structurées pour dépaqueter le tuple : auto [letter, points, passing] = ...
// Afficher :
// Grade: [letter]
// Points: [points]
// Passing: [yes/no] (afficher "yes" si passing est true, "no" si false)
return 0;
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation Orientée Objet
1Fondamentaux de la POO
Fichiers externesGénération et compilation en C++Fichiers d’en-tête et fichiers sourceEspaces de noms et portéeIntroduction à la POO en C++Classes et objetsLe pointeur « this »Méthodes (fonctions membres)Attributs (membres de données)Bases des constructeurs et destructeursRécapitulatif - Calculatrice simple4Propriétés de classe
Membres d’instance et statiquesAccesseurs et mutateursFonctions membres constMot-clé mutableMéthodes et variables statiquesFonctions et classes amiesRécapitulatif - Gestionnaire de compte bancaire7Héritage
Héritage de baseNiveaux d’accès de l’héritageOrdre d’appel des constructeurs et destructeursRedéfinition des méthodesFonctions virtuelles et VTableHéritage multipleHéritage virtuelRécapitulatif : hiérarchie des employés10Vue d’ensemble de la STL
Vue d’ensemble et philosophie de la STLConteneurs de la STLItérateursAlgorithmes de la STLFoncteurs et expressions lambdaRécapitulatif - fréquence des mots13Modèles de conception, partie 1
Introduction aux modèles de conceptionModèle SingletonFabrique et fabrique abstraiteModèle BuilderModèle ObserverModèle Strategy2Gestion de la mémoire
Mémoire de pile ou de tasPointeurs et référencesMémoire dynamique (new/delete)Pointeurs intelligents en C++RAII en C++Récapitulatif - Gestionnaire de tableaux dynamiques5Encapsulation
Spécificateurs d’accès en C++Spécificateurs d’accès en profondeurMasquage de l’informationStruct vs classeClasses imbriquées et internesRécapitulatif - Système de gestion des dossiers étudiants8Polymorphisme
Polymorphisme à la compilation vs à l’exécutionSurcharge de fonctionsRetour sur les fonctions virtuellesFonctions virtuelles puresClasses abstraitesConception d’interfaces en C++Conversion dynamique et RTTIRécapitulatif - Calculateur de formes3Constructeurs et destructeurs
Constructeur par défautConstructeur paramétréConstructeur de copieConstructeur de déplacementListes d’initialisation des constructeursConstructeurs déléguésApprofondissement des destructeursRègle des trois / cinq / zéroRécapitulatif - Classe String6Surcharge des opérateurs
Introduction à la surcharge des opérateursSurcharge des opérateurs arithmétiquesSurcharge des opérateurs de comparaisonOpérateurs de fluxSurcharge de l’opérateur d’affectationSurcharge des opérateurs [] et ()Opérateurs de conversion de typeRécapitulatif – Classe Matrix9Templates
Templates de fonctionsTemplates de classesSpécialisation des templatesTemplates variadiquesBases de SFINAE et des traits de typesRécapitulatif - Conteneur générique12Fonctionnalités modernes de C++
Sémantique de déplacement et rvaluesTransfert parfaitExpressions lambda en profondeurstd::function et std::bindconstexpr et constevalLiaisons structuréesoptional, variant, anyEntraînez-vous par vous-même : Compilateur C++ en ligne