我有一条规则应该返回一个 Boost.Fusion ASSOC_STRUCT。我正在尝试将规则解析器解析的结果分配给 _val,但我无法使其工作。我将跳过谈话,直接向您展示相关代码。
#include <boost/fusion/include/define_assoc_struct.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
#include <boost/fusion/include/as_vector.hpp>
#include <boost/spirit/include/qi_symbols.hpp>
#include <iostream>
#include <string>
namespace keys {
struct actor_key;
struct action_key;
struct money_key;
}
BOOST_FUSION_DEFINE_ASSOC_STRUCT(
(), ActionLine,
(int, action, keys::action_key)
(int, amount, keys::money_key)
(int, actor, keys::actor_key)
)
int main ()
{
namespace qi = boost::spirit::qi;
using qi::_1;
using qi::_2;
using qi::_a;
using qi::int_;
using qi::lit;
using boost::spirit::_val;
using boost::fusion::as_vector;
qi::symbols<char, int> name_parser_;
name_parser_.add("name4", 4);
std::string input("string1 ($7) string2 name4");
std::string::const_iterator f(input.begin()), l(input.end());
ActionLine expected{0, 7, 4}, result;
//The following rule is supposed to parse input of the form
//"string1 ($[integer]) string2 [name]"
//and return a triple (ActionLine) with the values { 0, value of (int_), value of (name_parser_) }
qi::rule<std::string::const_iterator, ActionLine()> action_line_ =
lit("string1 ($") >> int_ >> lit(") string2 ") >> name_parser_
// [ _val = ActionLine{0, _1, _2} ]; // this is what I am trying to achieve
[ _val = ActionLine{0, 7, 4} ]; //this compiles, but of course is not what I need
bool b =
qi::parse(f, l, action_line_, result) &&
as_vector(result) == as_vector(expected);
std::cout << "test: " << std::boolalpha << b << std::endl;
return 0;
}
(使用 g++ above_file.cpp -std=c++0x 编译)我的实际应用程序中的编译器错误与此示例中的有些不同,但类似于(在 _val = ActionLine{0, _1, _2} 的行中) : 没有调用::ActionLine::ActionLine()的匹配函数,我猜它不能将_1和_2转换为int。
我还尝试添加本地 int 变量并使用它们来复制解析的值,但它不起作用,没有使用 boost::phoenix::at(_1,0), boost::phoenix::at(_1,1 )(我发现这些想法在这里提升了精神语义动作参数)