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 に答える