如何使用Boost Spirit从std :: string中提取双对?

时间:2010-09-08 08:47:02

标签: c++ boost boost-spirit

我想用一对双序列解析一个字符串到std :: map中 与提升精神。

我改编了这个例子 http://svn.boost.org/svn/boost/trunk/libs/spirit/example/qi/key_value_sequence.cpp 但我有一个问题,为键和值分配一个合适的qi ::规则:

template <typename Iterator>
struct keys_and_values : qi::grammar<Iterator, std::map<double, double> >
{
    keys_and_values()
      : keys_and_values::base_type(query)
    {
        query =  pair >> *(qi::lit(',') >> pair);
        pair  =  key >> value;

        key   =  qi::double_;
        value = +qi::double_;
    }

    qi::rule<Iterator, std::map<double, double>()>  query;
    qi::rule<Iterator, std::pair<double, double>()> pair;
    qi::rule<Iterator, std::string()>               key, value;
};

我不能使用double()作为键和值规则,而std :: string则不能 由双人构建。

1 个答案:

答案 0 :(得分:0)

我不确定为什么在输出要求为

时不能使用double()键和值
 map<double, double>.

正如我所理解的那样,下面的代码应该解决它。

 template <typename Iterator>
 struct keys_and_values : qi::grammar<Iterator, std::map<double, double>() >
 {
     keys_and_values()
       : keys_and_values::base_type(query)
     {
         query =  pair >> *(qi::lit(',') >> pair);
         pair  =  key >> -(',' >> value);     // a pair is also separated by comma i guess

         key   =  qi::double_;
        value = qi::double_;    // note the '+' is not required here
     }

     qi::rule<Iterator, std::map<double, double>()>  query;
     qi::rule<Iterator, std::pair<double, double>()> pair;
     qi::rule<Iterator, double()>               key, value;    // 'string()' changed to 'double()'
 };

上面的代码将双序列1323.323,32323.232,3232.23,32222.23的输入解析为

地图[1323.323] = 32323.232

map [3232.23] = 32222.23