読者です 読者をやめる 読者になる 読者になる

Boost.Format で引数の番号も型も指定しない方法

Boost.Format では、引数の番号を指定してフォーマットが書ける。

boost::format("%1% %2% %3%") % 10 % "foo" % 0.5;

順番の入れ替えが可能なのに加えて、型を指定する必要がない。便利。
C の printf() 互換の形式も受け付ける。

boost::format("%d %s %g") % 10 % "foo" % 0.5;

いちいち細かく順番を指定する必要がない。順番通りと決まってるなら便利。
ところで、順番を指定せずに、かつ型も指定せずに書くにはどうすればいいか。
以下のようにするとできた。

boost::format("%|| %|| %||") % 10 % "foo" % 0.5;

元々 || の間には順番やら型やらを色々指定するのだけど、ここを空にしてしまえばいけるっぽい。
ちなみに余談だけど、順番なし指定と順番あり指定を混ぜるとエラーになる。

boost::format("%1% %|| %||") % 10 % "foo" % 0.5;  // エラー
boost::format("%|| %|| %3%") % 10 % "foo" % 0.5;  // エラー

前者はともかく後者は行けてもよさそうなものだけど…。何か理由があるんだろうなぁ。ちょっと残念。