C++ でのブール値の印刷
- C++ での True/False としてのブール値
-
C++ でブール値を出力するために 3 項文を追加して、
printf()
を変更する -
C++ で
cout
のstd::boolalpha
を使用してブール値を出力する -
C++ で
std::numpunc
のカスタムファセットを使用してブール値を出力する - まとめ
C++ でブール値を出力しようとすると、std::cout
によって 0
または 1
として出力されますが、出力を true
または false
の形式で表示した方がよい場合もあります。この記事では、C++ でブール値をテキスト形式で印刷する方法について説明します。
C++ での True/False としてのブール値
デバッグ中にコードとログファイルの行と行を読み取るシナリオを想定してみましょう。エラーと数値の海の中で 0
または 1
を見逃しがちです。したがって、bool 値を true/false
として出力することをお勧めします。
これを実現するための 3つの異なる方法を見ていきます。
C++ でブール値を出力するために 3 項文を追加して、printf()
を変更する
最も簡単な方法は、printf()
でわずかな変更を行うことで、true
または false
を出力できます。printf()
を使用して bool を印刷する場合、bool 値に特定のパラメーターがないため、%d
としてフォーマットを使用する必要があります。
bool は int
よりも短いため、printf()
ステートメントで渡されると int
にプロモートされます。しかし、これは単純な古い 0
と 1
を出力するので、3 値の if-statement
を追加し、フォーマット指定子を%s
に変更することで変更し、目的の true
または false
が出力されるように修正します。
コード例:
#include <iostream>
using namespace std;
int main() {
printf("boolean true: %d\n", true);
printf("boolean false: %d\n", false);
// modified printf()
printf("boolean true: %s\n", true ? "true" : "false");
printf("boolean false: %s\n", false ? "true" : "false");
}
出力:
boolean true: 1
boolean false: 0
boolean true: true
boolean false: false
この方法の問題は、ソースコードファイルが大きく複雑になると、読みやすさが妨げられることです。
C++ で cout
の std::boolalpha
を使用してブール値を出力する
std::boolalpha
は <iomanip>
ヘッダーファイルにあり、入力および出力ストリーム関数で動作します。標準ストリームには、画面に何を印刷するかを決定する boolalpha
フラグがあります。
true
に設定されている場合、ブール値のテキスト形式、つまり true
または false
が表示されますが、false
に設定されている場合、bool 出力は 0
および 1
としてのみ取得されます。
例:
#include <iostream>
using namespace std;
int main() {
cout << "when boolalpha flag is off\n";
cout << "true: " << true << endl;
cout << "false: " << false << endl;
cout << "when boolalpha flag is on\n";
cout << boolalpha << "true: " << true << endl;
cout << boolalpha << "false: " << false << endl;
cout << noboolalpha;
}
出力:
when boolalpha flag is off
true: 1
false: 0
when boolalpha flag is on
true: true
false: false
std::boolalpha
は、出力として true
または false
を出力するための最良の方法の 1つですが、いくつかの欠点があります。まず、std::noboolalpha
を介して使用した後、boolalpha
フラグをオフにする必要があります。
もう 1つの問題は、日本語または他の言語でコーディングし、true
または false の代わりに
"hai"
(日本語で true)または"nai"
(日本語で false)を印刷したい場合はどうなるかです。または単語を True
または False
として大文字にしたい場合は、std::boolalpha
だけを使用してこれらのいずれも実行できません。
C++ で std::numpunc
のカスタムファセットを使用してブール値を出力する
前の段落で述べたように、true
または false
以外のもの、または大文字またはローカライズされた出力を印刷したい場合はどうなりますか。これは、std::numpunct
のカスタムファセット
を使用して実行できます。
ファセット
は、特定の文化的側面に関連付けられたロケール機能セットを説明するクラスです。ストリームの入力および出力操作では、std::numpunct
から std::numget
および std::numput
を使用して、数値入力を解析し、数値出力をフォーマットします。
std::numpunct
のファセット
は、句読点の数値設定をカプセル化します。std::numpunct
にある関数 do_truename()
と do_falsename()
をオーバーライドすることで、std::boolalpha
フラグがアクティブなときに返す独自の文字列を指定できます。
この後、std::locale
オブジェクトと std::cout.imbue()
を使用して、現在のロケールを置き換えることができます。
コード例:
#include <ios>
#include <iostream>
#include <locale>
using namespace std;
class japanese_bool : public std::numpunct<char> {
protected:
std::string do_truename() const override { return "Hai"; }
std::string do_falsename() const override { return "NAI"; }
};
int main() {
cout.imbue(std::locale(std::locale(), new japanese_bool));
cout << std::boolalpha;
cout << "Japanese true : " << true << "\n";
cout << "Japanese false : " << false << "\n";
cout << noboolalpha;
}
上記のコードでは、new
はメモリリークではなく、japanese_bool
オブジェクトは暗黙的に参照カウントされ、std::locale
参照がスコープ外になると、自動的に破棄されます。
出力:
Japanese true : Hai
Japanese false : NAI
まとめ
この記事では、bool 出力を true
および false
として出力するさまざまな方法を説明しました。出力として true
または false
が必要な場合は最初の 2つの方法が推奨されますが、true または false だけでなく、特殊な出力が必要な場合は 3 番目の方法が推奨されます。