C ++ ha stringhe appropriate quindi potresti anche usarle. Sono nella stringa di intestazione standard. #include <stringa> per usarli. Niente più sovraccarichi di buffer strcat / strcpy; non più terminatori null mancanti; niente più disordinata gestione manuale della memoria; stringhe conteggiate corrette con semantica del valore appropriato.
C ++ ha anche la capacità di convertire i bool in rappresentazioni leggibili dall'uomo. Abbiamo visto suggerimenti in precedenza con gli esempi iostream, ma sono un po 'limitati perché possono solo mandare il testo alla console (o con fstreams, un file). Fortunatamente, i progettisti di C ++ non erano dei completi idioti; abbiamo anche iostream supportati non dalla console o da un file, ma da un buffer di stringhe gestito automaticamente. Si chiamano stringstream. #include <sstream> per ottenerli. Quindi possiamo 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();
}
Naturalmente, non vogliamo davvero scrivere tutto questo. Fortunatamente, C ++ ha anche una comoda libreria di terze parti chiamata Boost che può aiutarci qui. Boost ha una bella funzione chiamata lexical_cast. Possiamo usarlo così:
boost::lexical_cast<std::string>(my_bool)
Ora, è vero che questo è un overhead più alto di alcune macro; stringstreams si occupa di localizzazioni che potrebbero non interessarti e creano una stringa dinamica (con allocazione di memoria) mentre la macro può produrre una stringa letterale, che lo evita. Ma il rovescio della medaglia, il metodo stringstream può essere utilizzato per moltissime conversioni tra rappresentazioni stampabili e interne. Puoi eseguirli all'indietro; boost :: lexical_cast <bool> ("true") fa la cosa giusta, per esempio. Puoi usarli con i numeri e in effetti qualsiasi tipo con gli operatori I / O formattati correttamente. Quindi sono abbastanza versatili e utili.
E se dopo tutto questo il tuo profiling e benchmarking rivela che lexical_casts sono un collo di bottiglia inaccettabile, è allora che dovresti considerare di fare un po 'di macro horror.