лямбда не принята в ленивых аргументах - PullRequest
0 голосов
/ 28 января 2019

eps принимает ленивый аргумент, который оценивает bool.

Я использовал eps с объектами pheonix, такими как eps(_r1 == 0) >> something, и это сработало.

Однако, когдаЯ использую лямбда-функцию для более сложного выражения, которое не может быть выражено в форме pheonix, статическое утверждение поднято и не может скомпилироваться.

auto test_lazy_arg_f = [](const auto&, const auto& context) {
  return true;
}

boost::spirit::qi::eps(test_lazy_arg_f) >> whatever_i_need;

Это не скомпилируется со следующей ошибкой:

/usr/include/boost/spirit/home/qi/nonterminal/rule.hpp:177:13: error: static assertion failed: error_invalid_expression
         BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Expr);

https://wandbox.org/permlink/eiM6zDfyzuapcQtB (спасибо Никите Князеву)

Я не вижу никаких ограничений для ленивых аргументов в духовной документации.

Как я могу использовать не-pheonixфункциональный объект?

1 Ответ

0 голосов
/ 28 января 2019

Приведенный код не может воспроизвести вашу проблему (https://wandbox.org/permlink/uE5ONUXCjuX7j4Mt). Я предполагаю, что вы имели в виду в большем контексте.

Я думаю, что "необработанная сигнатура функции" работает только для точных совпадений (что неудобночтобы получить правильное и сложное сопровождение, см. параметры семантического действия для повышения духа ).

Итак, чтобы превратить любой вызываемый объект (ваша полиморфная лямбда) в актера Феникса, используйте phoenix::bind. Мне лично нравится использовать phoenix:function<>, чтобы обернуть свои вызываемые объекты.

У меня есть много примеров этого, но я вижу, например, повышение духа семантического действия с использованием объектов не пустых функций

...