#boost-spirit-x3
Вопрос:
Я хотел бы создать пользовательскую политику, производную от strict_real_policies, которая будет анализировать реальные значения, такие как «3,14», т. Е. с запятой после запятой, как используется, например, в Германии.
Это должно быть легко, верно?
Ответ №1:
#include lt;iostreamgt; #include lt;stringgt; #include lt;boost/spirit/home/x3.hppgt; template lt;typename Tgt; struct decimal_comma_strict_real_policies:boost::spirit::x3::strict_real_policieslt;Tgt; { template lt;typename Iteratorgt; static bool parse_dot(Iteratoramp; first, Iterator constamp; last) { if (first == last || *first != ',') return false; first; return true; } }; void parse(const std::stringamp; input) { namespace x3=boost::spirit::x3; std::cout lt;lt; "Parsing '" lt;lt; input lt;lt; "'" lt;lt; std::endl; std::string::const_iterator iter=std::begin(input),end=std::end(input); const auto parser = x3::real_parserlt;double, decimal_comma_strict_real_policieslt;doublegt;gt;{}; double parsed_num; bool result=x3::parse(iter,end,parser,parsed_num); if(result amp;amp; iter==end) { std::cout lt;lt; "Parsed: " lt;lt; parsed_num lt;lt; std::endl; } else { std::cout lt;lt; "Something failed." lt;lt; std::endl; } } int main() { parse("3,14"); parse("3.14"); }
Комментарии:
1. У меня был тот же код, что и у вас, за исключением того, что я пытался определить структуру decimal_comma_strict_real_policies в различных пространствах имен. Мне никогда не приходило в голову определять его вне какого-либо пространства имен!