我正在学习boost::spirit,并尝试将一些文本读取并解析成结构体。
例如,"
它的功能很好,但我想知道如何简化此代码?
例如,我想摆脱“mystruct0”语法规则,因为它只是标记类型“std :: pair ”,然后使用它自动从“mystruct”规则构造“TestStruct”对象。
如果可能的话,我还希望能够摆脱“std :: pair”中的“TestStruct”构造函数。
那么,以下代码是否可以被编译?这将是一个更好的解决方案:
很遗憾,编译器报告如下:
例如,"
2: 4.6
"在我的TestStruct
中被解析为int类型的2
和double类型的4.6
。#include <iostream>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/support_istream_iterator.hpp>
#include <boost/fusion/include/std_pair.hpp>
namespace qi = boost::spirit::qi;
struct TestStruct {
int myint;
double mydouble;
TestStruct() {}
TestStruct(std::pair<int,double> p) : myint(p.first), mydouble(p.second) {}
};
template <typename Iterator, typename Skipper>
struct MyGrammar : qi::grammar<Iterator, TestStruct(), Skipper> {
MyGrammar() : MyGrammar::base_type(mystruct) {
mystruct0 = qi::int_ >> ":" >> qi::double_;
mystruct = mystruct0;
}
qi::rule<Iterator, std::pair<int,double>(), Skipper> mystruct0;
qi::rule<Iterator, TestStruct(), Skipper> mystruct;
};
int main() {
typedef boost::spirit::istream_iterator It;
std::cin.unsetf(std::ios::skipws);
It it(std::cin), end; // input example: "2: 3.4"
MyGrammar<It, qi::space_type> gr;
TestStruct ts;
if (qi::phrase_parse(it, end, gr, qi::space, ts) && it == end)
std::cout << ts.myint << ", " << ts.mydouble << std::endl;
return 0;
}
它的功能很好,但我想知道如何简化此代码?
例如,我想摆脱“mystruct0”语法规则,因为它只是标记类型“std :: pair ”,然后使用它自动从“mystruct”规则构造“TestStruct”对象。
如果可能的话,我还希望能够摆脱“std :: pair”中的“TestStruct”构造函数。
那么,以下代码是否可以被编译?这将是一个更好的解决方案:
struct TestStruct {
int myint;
double mydouble;
TestStruct() {}
TestStruct(int i, double d) : myint(i), mydouble(d) {}
};
template <typename Iterator, typename Skipper>
struct MyGrammar : qi::grammar<Iterator, TestStruct(), Skipper> {
MyGrammar() : MyGrammar::base_type(mystruct) {
mystruct = qi::int_ >> ":" >> qi::double_;
}
qi::rule<Iterator, TestStruct(), Skipper> mystruct;
};
int main() {
typedef boost::spirit::istream_iterator It;
std::cin.unsetf(std::ios::skipws);
It it(std::cin), end; // input example: "2: 3.4"
MyGrammar<It, qi::space_type> gr;
TestStruct ts;
if (qi::phrase_parse(it, end, gr, qi::space, ts) && it == end)
std::cout << ts.myint << ", " << ts.mydouble << std::endl;
return 0;
}
很遗憾,编译器报告如下:
boost_1_49_0/include/boost/spirit/home/qi/detail/assign_to.hpp:123:
error: no matching function for call to ‘TestStruct::TestStruct(const int&)’