2012-03-18 40 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; 
} 
相关问题