僕は小数点数のパースがやりたかった

Boost.Spirit.Qi で定数リテラルのパースを行う処理を書くときに,小数点数と整数のパースでちょっと詰まった.

qi::double_ | qi::int_

とすると 42 などの整数値も double 型でパースされてしまうし,

qi::int_ | qi::double_

とすると,3.14 などの小数点数でも最初の 3 だけ読んで整数にパースされてしまう.

先読みして . があるか調べても良いけれど,inf とかもあるので面倒だと思って,ドキュメントに泣きついてみると,qi::double_ のような簡易パーサでなく,qi::real_parser を使うと,第2テンプレート引数にポリシーというのが取れることに気づいた.このポリシーに qi::strict_real_policies を指定してやると,小数点. があるときのみ小数点数にパースしてくれるようになる.他にも,符号なしの場合のみパースする qi::ureal_policies といった定義済みポリシーがあり,必要であれば自作もできるらしい.

もっと簡潔に書けるかもしれないけれど,とりあえずはこれでいけてる.