2012-03-18 39 views
2

我試過使用boost語義操作。在我的情況下,boost::bind是最簡單的解決方案。第一個例子很好,這裏我只用一個參數進行語義操作。爲什麼boost :: spirit :: qi語義動作在使用boost :: bind時有兩個參數?

#include <boost/config/warning_disable.hpp> 
#include <boost/spirit/include/qi.hpp> 
#include <boost/bind.hpp> 
#include <iostream> 
namespace qi = boost::spirit::qi; 

// A plain function 
void print(int const& i) 
{ 
    std::cout << i << std::endl; 
} 

int main() 
{ 
    using boost::spirit::qi::int_; 
    using boost::spirit::qi::parse; 

    char const *first = "{44}", *last = first + std::strlen(first); 
    parse(first, last, '{' >> int_[boost::bind(&print, _1)] >> '}'); 

    return 0; 
} 

我試過擴展我的代碼。在第二種情況下,我想將兩個參數傳遞給綁定函數,但編譯器不會編譯此代碼。什麼失敗?我沒有找到任何例子。 (int_ >> 「」>的形成 -

#include <boost/config/warning_disable.hpp> 
#include <boost/spirit/include/qi.hpp> 
#include <boost/bind.hpp> 
#include <iostream> 
namespace qi = boost::spirit::qi; 

// A plain function 
void print(int const& i1, int const& i2) 
{ 
    std::cout << i1 << "," << i2 << std::endl; 
} 

int main() 
{ 
    using boost::spirit::qi::int_; 
    using boost::spirit::qi::parse; 

    char const *first = "{44,55}", *last = first + std::strlen(first); 
    parse(first, last, '{' >> (int_ >> "," >> int_)[boost::bind(&print, _1,_2)] >> '}'); 

    return 0; 
} 

回答

2

,因爲只有一個輸入參數,則不能編譯這個代碼 - 升壓::融合:: vector的< INT,INT>: 第二個代碼是在這裏> int_)序列。試試這個

#include <boost/config/warning_disable.hpp> 
#include <boost/spirit/include/qi.hpp> 
#include <boost/bind.hpp> 
#include <iostream> 
namespace qi = boost::spirit::qi; 

// A plain function 
void print(boost::fusion::vector < int, int > arg_) 
{ 
    std::cout << boost::fusion::at_c <0> (arg_) << "," << boost::fusion::at_c <1> (arg_) << std::endl; 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    using boost::spirit::qi::int_; 
    using boost::spirit::qi::parse; 

    char const *first = "{44,55}", *last = first + std::strlen(first); 
    parse(first, last, '{' >> (int_ >> "," >> int_)[boost::bind(&print, _1)] >> '}'); 

    return 0; 
} 
相關問題