Boost Format の罠

Boost Formatは大変便利なライブラリです。printfとほぼ同じ書式指定で出力内容を整形できますので、ストリームのマニピュレータを使うよりずっと簡単にコードを記述できます。特に、C言語でprintf系の関数に慣れ親しんだものにとっては。ところが、そんなBoost Formatにも、微妙なところでprintfとの非互換性があり、油断していると罠にはまってしまいます。

非互換性に関するドキュメントをよく読めば全部書いていることですが、それでも失敗を犯すことは少なくありません。例えば、printfでは、

printf("%.8d\n", 123);

と記述すれば、

00000123

が出力されるわけですが、Boost Formatでは、

std::cout << boost::format("%.8d") % 123 << std::endl;

の出力結果は、

123

のようになってしまいます。すなわち、整数値に対する精度指定が無視されるわけです。浮動小数点数の場合は問題ないようです。また、

std::cout << boost::format("%08d") % 123 << std::endl;

とすれば、出力結果は、

00000123

のようになり、printfと同じになります。もう少し突っ込んでみると、printfでは、

printf("%0*d\n", 8, 123);

のように、最小フィールド幅に * を用いて、引数で指定することができますが、Boost Formatで、

std::cout << boost::format("%0*d") % 8 % 123 << std::endl;

のようにすると、

boost::io::too_many_args: boost::too_many_args: format-string referred to less arguments than were passed Aborted.

のように例外が送出されてしまいます。

他にもいくつか非互換性がありますので、「怪しいな?」と感じたら、すぐにドキュメントをあたってみる必要があります。

この記事のトラックバックURL:

http://www.kijineko.co.jp/trackback/388
このエントリーを含むはてなブックマーク