Spirit-Qi 文法で boost::phoenix を使用して、boost::variant のメンバーにアクセスする適切な方法が見つかりません。これは、私が達成しようとしている簡単な例です。(私の文法全体ははるかに複雑です。これは、言及された問題をテストしている単純なフラグメントです)。
namespace ph = boost::phoenix;
typedef boost::variant<std::string,int> VariantType;
typedef std::list<VariantType> TlstVariants;
rule<Iterator, void(TlstVariants&), Skipper> rule1;
rule1 =
qi::eps [ ph::push_back(qi::_r1, ph::construct<int>(2)) ]
>> qi::eps [ ph::get<int>(ph::back(qi::_r1)) = ph::val(3) ] //THIS IS EXAMPLE OF WHAT I NEED
;
TlstVariants lstVals;
ExecuteParser("5",rule1( ph::ref(lstVals) ));
BOOST_FOREACH( VariantType &val, lstVals )
{
std::cout << val.which() << " - " << val;
}
しかし、phoenix::get<> や、Phoenix を使用して boost::variant にアクセスする同様の方法が見つかりません。phoenix::get<> が必要な理由は、特定の型のリストにバリアントを挿入し、この特定の型を継承された属性として子ルールへの参照として渡す必要があるためです。
qi::rule<Iterator, void(structTest&), Skipper> rule_child;
rule =
qi::lit("test") [ph::push_back(sp::_r1, ph::construct<structTest>())]
> qi::lit('(')
> rule_child( ph::get<structTest>(ph::back(sp::_r1)) )
> qi::lit(')')
...
このような動作を実現する方法はありますか?
返信ありがとうございます
リック