为什么当我使用 boost::bind 时,boost::spirit::qi 语义操作不能使用两个参数?

Why doesn't boost::spirit::qi semantic action work with two arguments when I use boost::bind?

本文关键字:boost 不能 操作 参数 两个 spirit bind qi 为什么 语义      更新时间:2023-10-16

我尝试过使用boost语义操作。在我的情况下,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;
}

我已尝试扩展我的代码。在第二种情况下,我想向绑定函数传递两个参数,但编译器不会编译此代码。什么会失败?我没有找到任何例子。第二个代码在这里:

#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;
}

您无法编译此代码,因为只有一个输入参数-boost::fusion::vector<int,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;
}
相关文章: