4

我正在尝试构建一个解析器,它接受“/integer/(/integer/)”形式的字符串并生成一个 std::tuple 现在我有:

qi::rule<string::iterator,std::tuple<int,int>()> parser = 
      (qi::int_ >> '(' >> qi::int_ >> ')')[_val = std::make_tuple(qi::_1,qi::_2)]

哪个不会编译,因为占位符 qi::_i 不是正确的类型。如何从占位符中“提取”基础值?

4

1 回答 1

2

呃,你可以只使用自动属性传播(又名“自动规则”):

#include <boost/spirit/include/qi.hpp>
#include <boost/fusion/adapted.hpp>
#include <tuple>

namespace qi = boost::spirit::qi;

main( int argc, char* argv[] )
{
    qi::rule<std::string::iterator,std::tuple<int,int>()> parser;

    parser = 
        (qi::int_ >> '(' >> qi::int_ >> ')')
        ;
}

请注意用于适应std::tupleFusion 序列的附加标头。

于 2012-12-02T19:06:31.290 回答