Le C++ dispose de chaînes de caractères appropriées, alors autant les utiliser. Elles sont dans la chaîne d'en-tête standard. #include <string> pour les utiliser. Finis les dépassements de tampon de strcat/strcpy ; finis les terminaisons nulles manquantes ; finie la gestion manuelle désordonnée de la mémoire ; des chaînes comptées correctes avec une sémantique de valeur correcte.
Le C++ permet également de convertir les bools en représentations lisibles par l'homme. Nous en avons eu un aperçu plus tôt avec les exemples iostream, mais ils sont un peu limités car ils ne peuvent envoyer le texte que sur la console (ou avec fstreams, dans un fichier). Heureusement, les concepteurs du C++ n'étaient pas complètement idiots ; nous avons aussi des iostreams qui ne sont pas soutenus par la console ou un fichier, mais par un tampon de chaîne géré automatiquement. Ils sont appelés stringstreams. #include <sstream> pour les obtenir. Alors on peut dire :
std::string bool_as_text(bool b)
{
std::stringstream converter;
converter << std::boolalpha << b; // flag boolalpha calls converter.setf(std::ios_base::boolalpha)
return converter.str();
}
Bien sûr, nous n'avons pas vraiment envie de taper tout ça. Heureusement, le C++ dispose également d'une bibliothèque tierce pratique appelée Boost qui peuvent nous aider ici. Boost possède une belle fonction appelée lexical_cast. Nous pouvons l'utiliser ainsi :
boost::lexical_cast<std::string>(my_bool)
Maintenant, il est vrai de dire qu'il s'agit d'une surcharge plus importante que certaines macros ; les flux de chaînes de caractères traitent des locales dont vous pouvez ne pas vous soucier, et créent une chaîne dynamique (avec allocation de mémoire) alors que la macro peut produire une chaîne littérale, ce qui évite cela. Mais d'un autre côté, la méthode stringstream peut être utilisée pour un grand nombre de conversions entre les représentations imprimables et internes. Vous pouvez les exécuter à l'envers ; boost::lexical_cast<bool>("true") fait la bonne chose, par exemple. Vous pouvez les utiliser avec des nombres et en fait avec n'importe quel type avec les bons opérateurs d'E/S formatés. Ils sont donc assez polyvalents et utiles.
Et si, après tout cela, votre profilage et votre analyse comparative révèlent que les lexical_casts constituent un goulot d'étranglement inacceptable, c'est quand vous devriez envisager de faire de l'horreur macro.
6 votes
Objection ! Qu'en est-il de la localisation ? Pourquoi une langue elle-même contiendrait-elle des constantes littérales spécifiques à la langue ?
1 votes
@valdo - Je suis à peu près sûr que pour le projet sur lequel je travaillais, l'internationalisation n'était pas une préoccupation. À l'époque, il s'agissait probablement d'un projet scolaire.