Почему семантическое действие boost :: spirit :: qi не работает с двумя аргументами, когда я использую boost :: bind? - PullRequest
2 голосов
/ 19 марта 2012

Я пытался использовать буст семантические действия.В моем случае 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;
}

1 Ответ

2 голосов
/ 19 марта 2012

Вы не можете скомпилировать этот код, потому что есть только один входной параметр - boost :: fusion :: vector -, образованный последовательностью (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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...