C ++ tiene las cadenas adecuadas, por lo que también puede usarlas. Están en la cadena de encabezado estándar. #include <string> para usarlos. No más saturaciones de búfer strcat / strcpy; no más terminadores nulos faltantes; no más gestión de memoria manual desordenada; cadenas contadas adecuadas con semántica de valor adecuada.
C ++ también tiene la capacidad de convertir bools en representaciones legibles por humanos. Vimos sugerencias antes con los ejemplos de iostream, pero son un poco limitados porque solo pueden enviar el texto a la consola (o con fstreams, un archivo). Afortunadamente, los diseñadores de C ++ no eran unos idiotas completos; también tenemos iostreams que están respaldados no por la consola o un archivo, sino por un búfer de cadena administrado automáticamente. Se llaman cadenas de cadenas. #include <sstream> para obtenerlos. Entonces podemos decir:
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();
}
Por supuesto, realmente no queremos escribir todo eso. Afortunadamente, C ++ también tiene una conveniente biblioteca de terceros llamada Boost que puede ayudarnos aquí. Boost tiene una buena función llamada lexical_cast. Podemos usarlo así:
boost::lexical_cast<std::string>(my_bool)
Ahora bien, es cierto que se trata de una sobrecarga más alta que alguna macro; Los flujos de cadenas tratan con configuraciones regionales que quizás no le interesen y crean una cadena dinámica (con asignación de memoria) mientras que la macro puede producir una cadena literal, lo que evita eso. Pero, por otro lado, el método stringstream se puede utilizar para una gran cantidad de conversiones entre representaciones imprimibles e internas. Puede ejecutarlos al revés; boost :: lexical_cast <bool> ("true") hace lo correcto, por ejemplo. Puede utilizarlos con números y, de hecho, cualquier tipo con los operadores de E / S formateados correctamente. Por eso son bastante versátiles y útiles.
Y si después de todo esto, su perfil y evaluación comparativa revela que los lexical_casts son un cuello de botella inaceptable, es entonces cuando debería considerar hacer algo de macro horror.