假设我们有一个规则1
qi::rule<std::string::iterator, int()> rule1 = qi::int_[qi::_val=qi::_1];
我们决定获取一个int属性是不够的,我们也想得到原始数据(boost :: iterator_range)。我们可能有很多与rule1类型相同的规则。因此,最好有一个通用的解决方案。因此我们可以定义另一个规则2。
qi::rule<
std::string::iterator,
std::pair<int, boost::iterator_range<std::string::iterator>>(
qi::rule<std::string::iterator, int()>&
)
> rule2 = qi::raw[
qi::lazy(qi::_r1)[at_c<0>(qi::_val)=qi::_1]
][at_c<1>(qi::_val)=qi::_1];
规则2与测试代码配合良好。
std::pair<int, boost::iterator_range<std::string::iterator>> result;
auto itBegin=boost::begin(str);
auto itEnd=boost::end(str);
if (qi::parse(itBegin, itEnd, rule2(phx::ref(rule1)), result)) {
std::cout<<"MATCH! result = "<<result.first<<", "<<std::string(boost::begin(result.second), boost::end(result.second))<<std::endl;
} else {
std::cout<<"NOT MATCH!"<<std::endl;
}
但是如果rule1采用继承属性说一个bool。
qi::rule<std::string::iterator, int(bool)> rule1 = qi::int_[
if_(qi::_r1)[qi::_val=qi::_1]
.else_[qi::_val=-1]
;
为了测试目的,我们简单地从rule2传递一个true到rule1。
qi::rule<
std::string::iterator,
std::pair<int, boost::iterator_range<std::string::iterator>>(
qi::rule<std::string::iterator, int(bool)>&
)
> rule2 = qi::raw[
qi::lazy(qi::_r1)(true)[at_c<0>(qi::_val)=qi::_1]
][at_c<1>(qi::_val)=qi::_1];
但是编译器会报告error_invalid_e测试xpression错误。这有什么不对吗?谢谢。
答案 0 :(得分:2)
phx :: bind实际上解决了这个问题。
qi::rule<
std::string::iterator,
std::pair<int, boost::iterator_range<std::string::iterator>>(
qi::rule<std::string::iterator, int(bool)>&
)
> rule2 = qi::raw[
qi::lazy(phx::bind(qi::_r1,true))[at_c<0>(qi::_val)=qi::_1]
][at_c<1>(qi::_val)=qi::_1];