Y a-t-il une différence entre un std::pair
Et un std::Tuple
avec seulement deux membres? (Outre l'évidence que std::pair
nécessite deux et seulement deux membres et Tuple
peut avoir plus ou moins ...)
Il y a quelques différences:
std::Tuple
ne peut jamais être par mise en page standard (au moins, il n'est pas requis pour être par la norme). Chaque std::pair<T, Y>
est de mise en page standard si T
et Y
sont de mise en page standard.
Il est un peu plus facile d'obtenir le contenu d'un pair
que d'un Tuple
. Vous devez utiliser un appel de fonction dans le cas Tuple
, tandis que le cas pair
n'est qu'un champ membre.
Mais c'est à peu près tout.
C'est une réponse très tardive, mais notez que, parce que std::pair
est défini avec des variables membres, sa taille ne peut pas être optimisée à l'aide de optimisation de classe de base vide (first
et second
doivent occuper des adresses distinctes, même si l'une ou les deux sont une classe vide). Ceci est exacerbé par toutes les exigences d'alignement second_type
a, donc dans le pire des cas, le résultat std::pair
sera pratiquement le double de sa taille.
std::Tuple
n'autorise l'accès que par le biais des fonctions d'assistance, il est donc possible qu'il dérive de l'un ou l'autre type si l'un ou l'autre est vide, ce qui permet d'économiser sur la surcharge. L'implémentation de GCC, au moins, le fait certainement ... vous pouvez fouiller dans les en-têtes pour le vérifier, mais il y a aussi this comme preuve.
Le nom d'un std::Tuple
Est plus long (un caractère supplémentaire). Un plus grand nombre de ces caractères sont saisis avec la main droite, donc plus facile à saisir pour la plupart des gens.
Cela dit, std::pair
Ne peut avoir que deux valeurs - pas zéro, une, trois ou plus. DEUX valeurs. Un tuple, cependant, n'a presque aucune limitation sémantique sur le nombre de valeurs. Un std::pair
Est donc un type sûr de type plus précis à utiliser si vous voulez réellement spécifier une paire de valeurs.
Pour ce que ça vaut, je trouve que la sortie GDB de std :: Tuple est beaucoup plus difficile à lire. Évidemment, si vous avez besoin de plus de 2 valeurs, std :: pair ne fonctionnera pas, mais je considère cela comme un point en faveur des structures.
Notez qu'avec C++ 17, on peut utiliser la même interface pour lire les données de la paire et du tuple avec deux éléments.
auto [a, b] = FunctionToReturnPairOrTuple();
Pas besoin d'utiliser get<>
:)