A propos de std::tie , ils disent :
" Les décompositions sont apparues en C++17, mais avant, il existait une autre façon de faire, qui existe toujours soit dit en passant. Il s’agit de std::tie. Le principe est identique, puisque on veut assigner à des variables les différents éléments d’un tuple ou d’une structure. Sauf qu’ici, les variables doivent être déclarées au préalable.
Cette solution présente a comme inconvénient majeur que les variables doivent être déclarées à l’avance et donc qu'on ne peut pas profiter de l’inférence de type. Par contre, l’avantage qu’elle a sur la décomposition, c’est qu’elle permet d’ignorer certaines valeurs qui ne nous intéressent pas et que nous ne voulons pas récupérer, grâce à std::ignore.
Un autre avantage, c’est de pouvoir réutiliser une même variable plusieurs fois, alors que la décomposition C++17 ne nous le permet pas. "
Voici l'exemple avec les explications:
#define _USE_MATH_DEFINES
#include <cmath>
#include <iostream>
#include <string>
#include <tuple>
std::tuple<int, std::string> f()
{
using namespace std::literals;
return { 20, "Clem"s };
}
std::tuple<double, double> g(double angle)
{
return { std::cos(angle), std::sin(angle) };
}
int main()
{
// AVANT
// std::tuple resultats_scolaires = f();
// std::cout << "Tu t'appelles " << std::get<std::string>(resultats_scolaires) << " et tu as obtenu " << std::get<int>(resultats_scolaires) << " / 20." << std::endl;
// Maintenant, on sait qu'on a affaire à un nom et un entier.
auto[note, nom] = f();
std::cout << "Tu t'appelles " << nom << " et tu as obtenu " << note << " / 20." << std::endl;
// AVANT
// std::tuple calculs = g(M_PI / 2.);
// std::cout << "Voici le cosinus de PI / 2 : " << std::get<0>(calculs) << std::endl;
// std::cout << "Voici le sinus de PI / 2 : " << std::get<1>(calculs) << std::endl;
// Maintenant, on sait qu'on a affaire à deux valeurs mathématiques.
auto[cosinus, sinus] = g(M_PI / 4.);
std::cout << "Voici le cosinus de PI / 4 : " << cosinus << std::endl;
std::cout << "Voici le sinus de PI / 4 : " << sinus << std::endl;
return 0;
}
Et ils ajoutent :
Notez comment le code se voit simplifié et clarifié. Nous avons remplacé une ligne aussi peu claire que std::get<0>(calculs) par cosinus. D’un coup d’œil, vous voyez ce que fait la variable et ce que nous manipulons. Le code est plus lisible et donc de meilleure qualité
Sauf que pour moi , ca compile pas 🙁