-
st::string & operator+()
Bonjour,
En regardant la liste des surcharges de operator+() impliquant un std::string (http://www.cplusplus.com/reference/string/operator+/), j'ai été étonné que celui-ci ne permette pas de concaténer un des types primitifs tel des int ou des double.
Y a-t-il une raison particulière pour laquelle ces surcharges n'ont pas été incluent dans le standard? Celles-ci permettraient de simplifier l'utilisation des chaînes de caractères en évitant d'avoir à faire appel à un std::stringstream ou à une bibliothèque externe (e.g. http://www.boost.org/doc/libs/1_47_0...xical_cast.htm)
-
Je serais tenté de dire que ça permet d'éviter de faire n'importe quoi sans s'en rendre compte
-
Salut,
Le fait est que la concaténation de primitifs passe par leur conversion (même si tu utilise les meme touches, 1 ne vaut déjà pas '1' et 1234 est encore moins égal à "1234" car le premier tiendra dans un int alors que l'autre nécessite un tableau de 5 char ! )
Or il existe un principe dont l'acroyme est ORP (pour One responsability Principle : principe de la responsabilité unique :D ) qui nous fait remarquer que si une fonction ou un type a plus d'une responsabilité, c'est sans doute qu'elle en a trop!
Beaucoup de projets deviennent exagérément complexes parce que ce principe est oublié, ou parce que l'on n'a pas choisi une granularité correcte en ce qui concerne la responsabilité qu'un objet doit prendre. (exemple sur demande ;) )
Cette conversion ne fait donc pas partie des responsabilités que doit avoir une chaine de caractères, car la seule responsabilité c'est... de gérer des caractères sous forme de chaine "imprimables".
Cela lui donne déjà largement assez de boulot, car il faut te dire que cela induit toute une gestion de mémoire de sorte à ne jamais en arriver à aller placer un caractère "là où il ne faut pas" :P
Pour tout ce qui est des conversions de / vers des chaines de caractères, tu as la hiérarchie stringstream, dont c'est la responsabilité unique et qui peut même par surcharge convertir tes types perso ;)
Si tu veux concaténer une chaine et un nombre, il faut donc passer par la conversion (via *stringstream) et concaténer le résultat de cette conversion avec la chaine existante ;)