C ++ a des chaînes appropriées, vous pouvez donc aussi bien les utiliser. Ils sont dans la chaîne d'en-tête standard. #include <string> pour les utiliser. Plus de dépassements de tampon strcat / strcpy; plus de terminateurs nuls manquants; plus de gestion manuelle de la mémoire désordonnée; chaînes comptées correctement avec une sémantique de valeur appropriée.
C ++ a également la capacité de convertir des booléens en représentations lisibles par l'homme. Nous avons vu des indices plus tôt avec les exemples iostream, mais ils sont un peu limités car ils ne peuvent envoyer le texte que vers la console (ou avec fstreams, un fichier). Heureusement, les concepteurs de C ++ n'étaient pas des idiots complets; nous avons également des iostreams qui ne sont pas sauvegardés 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 ne voulons pas vraiment taper tout cela. Heureusement, C ++ dispose également d'une bibliothèque tierce pratique nommée Boost qui peut nous aider ici. Boost a une fonction intéressante appelée lexical_cast. On peut l'utiliser ainsi:
boost::lexical_cast<std::string>(my_bool)
Maintenant, il est vrai de dire que c'est une surcharge plus élevée que certaines macro; Les chaînes de caractères traitent des paramètres régionaux dont vous ne vous souciez peut-être pas 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 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 benchmarking révèlent que les lexical_casts sont un goulot d'étranglement inacceptable, c'est à ce moment que vous devriez envisager de faire de l'horreur macro.