Gli stream standard hanno un flag boolalpha
che determina ciò che viene visualizzato - quando è falso, verrà visualizzato come 0
e 1
. Quando è vero, verranno visualizzati come false
e true
.
C'è anche un std::boolalpha
manipolatore per impostare il flag, quindi questo:
#include <iostream>
#include <iomanip>
int main() {
std::cout<<false<<"\n";
std::cout << std::boolalpha;
std::cout<<false<<"\n";
return 0;
}
... produce un output simile:
0
false
Per quello che vale, la parola effettivamente prodotta quando boolalpha
è impostato su true è localizzato - ovvero, <locale>
ha una categoria num_put
che gestisce le conversioni numeriche, quindi se si inserisce un flusso con le impostazioni internazionali corrette, può/stamperà true
e false
come sono rappresentati in quella localizzazione. Ad esempio,
#include <iostream>
#include <iomanip>
#include <locale>
int main() {
std::cout.imbue(std::locale("fr"));
std::cout << false << "\n";
std::cout << std::boolalpha;
std::cout << false << "\n";
return 0;
}
... e almeno in teoria (supponendo che il/libreria standard compilatore accetta "fr" come identificatore per "francese") potrebbe stampare faux
invece di false
. Dovrei aggiungere, tuttavia, che il vero supporto per questo è alquanto irregolare - anche la libreria Dinkumware/Microsoft (di solito abbastanza buona a questo riguardo) stampa false
per ogni lingua che ho controllato.
I nomi utilizzati sono definiti in un aspetto di numpunct
, quindi se si desidera che vengano stampati correttamente per una lingua specifica, è possibile creare una faccetta di numpunct
. Ad esempio, uno che (credo) è almeno ragionevolmente accurate per il francese sarebbe simile a questa:
#include <array>
#include <string>
#include <locale>
#include <ios>
#include <iostream>
class my_fr : public std::numpunct<char> {
protected:
char do_decimal_point() const { return ','; }
char do_thousands_sep() const { return '.'; }
std::string do_grouping() const { return "\3"; }
std::string do_truename() const { return "vrai"; }
std::string do_falsename() const { return "faux"; }
};
int main() {
std::cout.imbue(std::locale(std::locale(), new my_fr));
std::cout << false << "\n";
std::cout << std::boolalpha;
std::cout << false << "\n";
return 0;
}
e il risultato è (come si sarebbe probabilmente aspetta):
0
faux
Perché non provarlo? –
Come dovremmo chiudere questo? –
Suggerimento: è garantito stampare la stessa cosa su ogni compilatore conforme. – chris