Определение strict_real_policies для реальных значений с десятичным символом запятой

#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 в различных пространствах имен. Мне никогда не приходило в голову определять его вне какого-либо пространства имен!