2017-03-06 24 views
2

として継承された属性を持つルールの我々はルール1チー::継承属性

qi::rule<std::string::iterator, int()> rule1 = qi::int_[qi::_val=qi::_1]; 

を持っており、我々は属性としてint型を取得して決めましょうが、十分ではありません、我々はまた、強化(生データを取得したい:: iterator_range)。ルール1と同じタイプのルールがたくさんあるかもしれません。だから、これのための汎用的なソリューションを持っている方が良いです。したがって、別のルール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] 
; 

テストの目的で、ルール2からルール1にtrueを渡します。

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エラーを報告します。これに何か問題がありますか?ありがとう。

答えて

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]; 
関連する問題