サンプルの動作確認バージョン [GCC4.4/1.41.0] [VC9/1.41.0]
#include <iostream>
#include <boost/format.hpp>
using namespace std;
int main()
{
// %1%が一番目のパラメータ、%2%が二番目のに置き換わります。
cout <<
boost::format("%1% %2%") % "hello" % 100
<< endl;
// printfと同じ書式もOK。
// %05d:0埋めで5桁の整数 %x:16進表記 %f:浮動小数点数 %%:%そのもの
cout <<
boost::format("%05d %x %f %%") % 200 % 255 % 3.33
<< endl;
// さらに、%2%と%1%を逆順に使うことも
cout <<
boost::format("%2% %1%") % "hello" % 100
<< endl;
// %N$...で順番指定と出力形式指定の合わせ技
// %04x:0埋めで4桁の16進整数 %s:文字列
cout <<
boost::format("%2$04x %1$s") % "hello" % 254
<< endl;
return 0;
}
hello 100 00200 ff 3.330000 % 100 hello 00fe hello
C標準ライブラリのprintf関数はかなり便利で、
C++を使うことに決めても文字出力はついついprintfを使ってしまう…
という人もいるのではないかと思います。というか、私は割とその傾向があります。
(^^; printfに比べてC++のiostreamの不便なところと言うと、
出力フォーマットを指定する時の指定が面倒だったり(ios_state参照)、文字数字文字数字…と交互に出力するようなときに
やたらと<<
を書きまくることになって、
長くて読みにくいソースが出来あがったりする点ですね。
しかし逆に、「型やパラメータの個数に関して安全である」 (親切なコンパイラでないと、printfの引数を間違えて書いてしまっても、 平気でコンパイルが通ってしまう)とか、「自分で新しく作った型でも、 同じ方式で出力が出来る」(printfを int,double,char* などの限られた型以外に拡張することは不可能)などの利点も存在しています。
そこで型安全で拡張可能なprintfが欲しくなるわけですが、それを目指したのがこの
format ライブラリです。可変長引数を使わずに operator%
でデータを受け取ることでformatter側に型の情報がちゃんと渡るという寸法です。
printf互換の形式を使った場合%dや%fなどの型指定はほぼ無視されるのですが、 これと実際の値に型不一致があったら例外を投げるように出来た方が 良かったのではないかなぁ、と個人的には思ったりもしますが。