126 votes

Pourquoi l'utilisation des tuples en C++ n'est-elle pas plus courante ?

Pourquoi personne ne semble utiliser les tuples en C++, que ce soit les Bibliothèque Boost Tuple ou la bibliothèque standard de TR1 ? J'ai lu beaucoup de code C++, et je ne vois que très rarement l'utilisation de tuples, mais je vois souvent beaucoup d'endroits où les tuples résoudraient de nombreux problèmes (généralement le retour de valeurs multiples à partir de fonctions).

Les tuples vous permettent de faire toutes sortes de choses sympas comme celles-ci :

tie(a,b) = make_tuple(b,a); //swap a and b

C'est certainement mieux que ça :

temp=a;
a=b;
b=temp;

Bien sûr, vous pouvez toujours faire ça :

swap(a,b);

Mais que faire si vous voulez faire pivoter trois valeurs ? Vous pouvez le faire avec des tuples :

tie(a,b,c) = make_tuple(b,c,a);

Les tuples facilitent également le retour de plusieurs variables à partir d'une fonction, ce qui est probablement un cas beaucoup plus courant que l'échange de valeurs. L'utilisation de références pour retourner les valeurs n'est certainement pas très élégante.

Y a-t-il des inconvénients majeurs aux tuples auxquels je ne pense pas ? Si non, pourquoi sont-ils rarement utilisés ? Sont-ils plus lents ? Ou est-ce simplement parce que les gens ne sont pas habitués à les utiliser ? Est-ce une bonne idée d'utiliser les tuples ?

125voto

Trey Jackson Points 49816

Une réponse cynique est que de nombreuses personnes programment en C++, mais ne comprennent pas et/ou n'utilisent pas les fonctionnalités de plus haut niveau. Parfois, c'est parce qu'ils n'y sont pas autorisés, mais beaucoup n'essaient tout simplement pas (ou ne comprennent même pas).

Comme exemple sans boost : combien de personnes utilisent la fonctionnalité trouvée dans <algorithm> ?

En d'autres termes, de nombreux programmeurs C++ sont simplement des programmeurs C utilisant des compilateurs C++, et peut-être std::vector et std::list . C'est l'une des raisons pour lesquelles l'utilisation de boost::tuple n'est pas plus fréquent.

43voto

Alan De Smet Points 654

Parce que ce n'est pas encore standard. Tout ce qui n'est pas standard a un obstacle beaucoup plus élevé. Des éléments de Boost sont devenus populaires parce que les programmeurs les réclamaient. (hash_map me vient à l'esprit). Mais alors que tuple est pratique, ce n'est pas une victoire si écrasante et claire que les gens s'en préoccupent.

23voto

user21714 Points 3596

La syntaxe des tuplets C++ peut être un peu plus verbeuse que la plupart des gens ne le souhaitent.

Pensez-y :

typedef boost::tuple<MyClass1,MyClass2,MyClass3> MyTuple;

Donc, si vous voulez faire un usage intensif des tuples, soit vous avez des typedefs de tuples partout, soit vous avez des noms de types ennuyeux et longs partout. J'aime les tuples. Je les utilise quand c'est nécessaire. Mais c'est généralement limité à quelques situations, comme un index à N éléments ou l'utilisation de multimaps pour lier les paires d'itérateurs de plage. Et c'est généralement dans un cadre très limité.

Tout cela est très moche et ressemble à du bricolage si on le compare à quelque chose comme Haskell ou Python. Lorsque C++0x arrivera et que nous aurons le mot-clé 'auto', les tuples commenceront à être beaucoup plus attrayants.

L'utilité des tuples est inversement proportionnelle au nombre de frappes nécessaires pour les déclarer, les emballer et les dépaqueter.

8voto

Steve Jessop Points 166970

Mais que faire si vous voulez faire pivoter trois valeurs ?

swap(a,b);
swap(b,c);  // I knew those permutation theory lectures would come in handy.

OK, donc avec 4 valeurs etc, finalement le n-tuple devient moins codé que n-1 swaps. Et avec le swap par défaut, cela fait 6 affectations au lieu des 4 que vous auriez si vous implémentiez vous-même un modèle à trois cycles, bien que j'espère que le compilateur résoudra ce problème pour les types simples.

Vous pouvez imaginer des scénarios dans lesquels les échanges sont difficiles à gérer ou inappropriés, par exemple :

tie(a,b,c) = make_tuple(b*c,a*c,a*b);

est un peu difficile à déballer.

Le fait est, cependant, qu'il existe des moyens connus de traiter les situations les plus courantes pour lesquelles les tuples sont bons, et donc qu'il n'y a pas de grande urgence à prendre en compte les tuples. En tout cas, je n'en suis pas sûr :

tie(a,b,c) = make_tuple(b,c,a);

ne fait pas 6 copies, ce qui le rend totalement inadapté à certains types (les collections étant les plus évidentes). N'hésitez pas à me persuader que les tuples sont une bonne idée pour les "grands" types, en disant que ce n'est pas le cas :-)

Pour renvoyer plusieurs valeurs, les tuples sont parfaits si les valeurs sont de types incompatibles, mais certaines personnes ne les aiment pas s'il est possible pour l'appelant de les obtenir dans le mauvais ordre. Certaines personnes n'aiment pas du tout les valeurs de retour multiples, et ne veulent pas encourager leur utilisation en les rendant plus faciles. Certaines personnes préfèrent simplement les structures nommées pour les paramètres d'entrée et de sortie, et ne pourraient probablement pas être persuadées avec une batte de baseball d'utiliser des tuples. Les goûts et les couleurs ne se discutent pas.

6voto

Brian Neal Points 13668

Tout le monde ne peut pas utiliser le boost, et le TR1 n'est pas encore largement disponible.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X