具有自定义属性解析的Boost Spirit规则

具有自定义属性解析的Boost Spirit规则,boost,attributes,boost-spirit,boost-spirit-qi,boost-phoenix,Boost,Attributes,Boost Spirit,Boost Spirit Qi,Boost Phoenix,我正在编写Boost Spirit语法,将文本解析为以下结构的向量: struct Pair { double a; double b; }; BOOST_FUSION_ADAPT_STRUCT( Pair, (double, a) (double, a) ) 该语法有如下规则: qi::rule<Iterator, Pair()> pairSequence; pairSequence = double_[_val = Pair(_1,

我正在编写Boost Spirit语法,将文本解析为以下结构的向量:

struct Pair
{
    double a;
    double b;
};

BOOST_FUSION_ADAPT_STRUCT(
    Pair,
    (double, a)
    (double, a)
)
该语法有如下规则:

qi::rule<Iterator, Pair()> pairSequence;
pairSequence = double_[_val = Pair(_1, DEFAULT_B)] % separator;
我希望这个语法生成一个
,其中
a
等于双精度,
b
等于某个常数。我想这样做:

qi::rule<Iterator, Pair()> pairSequence;
pairSequence = double_[_val = Pair(_1, DEFAULT_B)] % separator;

当然,上面的内容无法编译。我尝试向Pair添加构造函数,但仍然出现编译错误(调用“Pair::Pair(const boost::phoenix::actor>&,double)”时没有匹配的函数)。

首先,
pairSequence的签名需要是:

qi::rule<Iterator, std::vector<Pair>()> pairSequence; 
这样可以简化语法:

pairSequence = double_ % separator; 
并完全依赖Spirit的内置属性传播规则

顺便说一句,要想让这一切都起作用,你不需要将
Pair
调整为融合序列。

啊,是的,我错过了向量构造。
pairSequence = double_ % separator;