Paires et tuples

Vous avez déjà utilisé le type pair au cours d’exercices précédents. Nous allons maintenant vous présenter son cousin, la classe tuple.


Pour cet exercice, vous modifierez le fichier :
- chap-05/5-tuples.cpp

La cible à compiler est c5-5-tuples.


Micro rappel sur les pair

La classe pair est un type templaté avec deux paramètres :

std::pair<int, float> such_a_nice_pair { 1, 3.f };

On accède aux éléments de la pair directement via ses attributs first et second (pas de getters) :

int int_value     = such_a_nice_pair.first;
float float_value = such_a_nice_pair.second;

Enfin, pour créer des pair à la volée, c’est-à-dire sans définir de variables (passage à une fonction par exemple), on peut utiliser le code suivant :

std::map<unsigned int, float> values;

// Si les valeurs sont correctement typées :
values.insert(std::make_pair(3u, 5.f));
values.insert(std::pair { 4u, 9.5f });

// Si les valeurs requièrent une conversion :
values.insert(std::make_pair<unsigned int, float>(2, 8));
values.insert(std::pair<unsigned int, float> { 12, -6.5 });

Les tuples

Un tuple, c’est comme une pair, sauf qu’au lieu de ne contenir que deux éléments, elle peut en contenir autant qu’on veut.

Contrairement aux pair, on ne récupérera pas les valeurs avec first, second, third, etc. Il faudra utiliser la fonction libre std::get :

std::tuple<std::string, int> named_value { "one", 1 };

auto name  = std::get<0>(named_value);
auto value = std::get<1>(named_value);

Pourquoi une fonction libre plutôt qu’une fonction-membre ? Aucune idée. Mais en tout cas, rappelez-vous que si vous écrivez some_tuple.get(0), ça ne compilera pas.

L’un des intérêts du tuple, c’est de pouvoir regrouper plusieurs valeurs dans une seule, sans avoir à définir de nouvelle classe.
Lorsqu’une fonction devait vous retourner plusieurs valeurs, vous étiez souvent contraints d’ajouter des “paramètres de retour” à la fonction.
Maintenant, vous saurez que vous pouvez utiliser des tuples.

Modifiez le code du fichier 5-tuples.cpp afin d’appliquer ce principe.

Solution