2011-05-05 51 views
0

爲了將它們與Boost.Spirit V2.x(特別是Boost.Spirit.Qi)一起使用,是否真的需要用Boost.Fusion包裝結構體/類?我寧願使用語義動作來分配給成員。如果我的記憶爲我服務,那麼這就是它以前在V1.x中完成的方式...是否可以在沒有Boost.Fusion的情況下使用Boost.Spirit V2.x?

calculator example表明它應該仍然有可能。到目前爲止,我還沒有找到一個好方法來做到這一點。

我想看看你會怎麼做employee example。以下不編譯,但也許有一些方法,使其工作:

template <typename Iterator> 
struct employee_parser : qi::grammar<Iterator, employee(), ascii::space_type> 
{ 
    employee_parser() : employee_parser::base_type(start) 
    { 
     using qi::int_; 
     using qi::lit; 
     using qi::double_; 
     using qi::lexeme; 
     using ascii::char_; 

     quoted_string %= lexeme['"' >> +(char_ - '"') >> '"']; 

     start = 
      lit("employee") 
      >> '{' 
      >> int_[px::bind(&employee::age, qi::_val) = qi::_1] >> ',' 
      >> quoted_string[px::bind(&employee::surname, qi::_val) = qi::_1] >> ',' 
      >> quoted_string[px::bind(&employee::forename, qi::_val) = qi::_1] >> ',' 
      >> double_[px::bind(&employee::salary, qi::_val) = qi::_1] 
      >> '}' 
      ; 
    } 

    qi::rule<Iterator, std::string(), ascii::space_type> quoted_string; 
    qi::rule<Iterator, employee(), ascii::space_type> start; 
}; 

回答

1

沒關係,我仍然有舊的融合印刷的東西在那裏。有趣的是,在你發佈這個問題之後,錯誤如何變得如此容易,以至於很容易找到...... :)

(由於這個原理,我必須在生產代碼中提出另一個錯誤。)

相關問題