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 番目の方法が推奨されます。
