Ответ 1
Стандартные потоки имеют флаг boolalpha
, который определяет, что отображается, когда оно ложно, они будут отображаться как 0
и 1
. Когда это правда, они будут отображаться как false
и true
.
Там также есть манипулятор std::boolalpha
, чтобы установить флаг, так что это:
#include <iostream>
#include <iomanip>
int main() {
std::cout<<false<<"\n";
std::cout << std::boolalpha;
std::cout<<false<<"\n";
return 0;
}
... производит вывод, например:
0
false
Для того, что стоит, фактическое слово, созданное, когда boolalpha
установлено в true, локализовано, то есть <locale>
имеет категорию num_put
, которая обрабатывает числовые преобразования, поэтому, если вы наполните поток правильной locale, он может/будет распечатывать true
и false
, поскольку они представлены в этой локали. Например,
#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;
}
... и, по крайней мере, в теории (если ваша компилятор/стандартная библиотека принимает "fr" как идентификатор для "French" ), она может распечатывать faux
вместо false
. Я должен добавить, однако, что настоящая поддержка для этого в лучшем случае неравномерна - даже библиотека Dinkumware/Microsoft (обычно неплохая в этом отношении) печатает false
для каждого языка, который я проверил.
Имена, которые будут использоваться, определены в фате numpunct
, хотя, если вы действительно хотите, чтобы они правильно распечатались для определенного языка, вы можете создать фасет numpunct
, чтобы сделать это. Например, тот, который (я считаю), по крайней мере разумно точным для французского, будет выглядеть так:
#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;
}
И результат (как вы, вероятно, ожидаете):
0
faux