僕は小数点数のパースがやりたかった
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 といった定義済みポリシーがあり,必要であれば自作もできるらしい.
もっと簡潔に書けるかもしれないけれど,とりあえずはこれでいけてる.