> qi::double_ vs.s. >> qi::double_
我想解析以下字符串
"***: @a_-091 , *** 1"
到定义为
的结构 using type = boost::fusion::vector<char, int, double>;
解析器时
*qi::omit[qi::char_ - '@'] >> '@' >> qi::char_ >> '_' >> qi::int_ >> *qi::omit[qi::char_ - qi::digit] >> qi::double_
使用,结果还可以。但是,结果与以下解析器完全不同
*qi::omit[qi::char_ - '@'] >> '@' >> qi::char_ >> '_' >> qi::int_ >> *qi::omit[qi::char_ - qi::digit] > qi::double_
以下是示例代码。
#include <vector>
#include <sstream>
#include <iostream>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/qi_match.hpp>
#include <boost/fusion/include/io.hpp>
using type = boost::fusion::vector<char, int, double>;
int main() {
std::istringstream istr{
"***: @a_-091 , *** 1"
};
std::vector<type> data;
namespace qi = boost::spirit::qi;
istr >> std::noskipws >> qi::match(*(
*qi::omit[qi::char_ - '@'] >> '@' >> qi::char_ >> '_' >> qi::int_ >> *qi::omit[qi::char_ - qi::digit] > qi::double_
), data);
// istr >> std::noskipws >> qi::match(*(
*qi::omit[qi::char_ - '@'] >> '@' >> qi::char_ >> '_' >> qi::int_ >> *qi::omit[qi::char_ - qi::digit] >> qi::double_
), data);
for (size_t i = 0; i != data.size(); ++i) {
std::cerr << data[i] << "\n";
}
return 0;
}
PS: 该问题已通过评论中 cv_and_he 证明的链接得到解决。它是由&#34;&gt;&gt;&#34;的混合使用引起的。 (序列解析器)和&#34;&gt;&#34; (期望解析器)。
答案 0 :(得分:0)
作为一个快速提示,也许您可以使用>>
重写。
仍然有期望点你可以写
a >> b > c
像
a >> b >> (c > eps)
我稍后会测试