yohhoyの日記

技術的メモをしていきたい日記

boolalphaマニピュレータ

C++標準ライブラリが提供するstd::boolalphaマニピュレータ(manipulator)と、独自ロケール(locale)/ファセット(facet)を用いた出力文字列の差し替え。

ファセットstd::numpunct<charT>do_truename, do_falsename仮想メンバ関数をオーバーライドして、bool値をストリーム出力したときの出力文字列を差し替え可能。C++標準ライブラリの既定ファセットでは文字列 "true"/"false" が出力される。

#include <iostream>
#include <locale>

struct my_numpunct : std::numpunct<char> {
  using std::numpunct<char>::string_type;  // std::basic_string<char>
  string_type do_truename()  const { return "真"; }
  string_type do_falsename() const { return "偽"; }
};

int main()
{
  // 既定では数値(1/0)を出力
  std::cout << true << " " << false << std::endl;

  // 標準facetを使って出力
  std::cout << std::boolalpha;
  std::cout << true << " " << false << std::endl;

  // 自作facetを使って出力
  std::locale loc(std::locale(), new my_numpunct);
  std::cout.imbue(loc);
  std::cout << true << " " << false << std::endl;
}

実行結果:

1 0
true false
真 偽

C++03 22.2.3.1.2/p4より引用。C++11(N3337)では22.4.3.1.2/p5-6。

string_type do_truename() const;
string_type do_falsename() const;
4 Returns: A string representing the name of the boolean value true or false, respectively. In the base class implementation these names are "true" and "false", or L"true" and L"false".