Ich kann keinen richtigen Weg finden, wie man auf Mitglieder von boost::variant mit boost::phoenix in meiner Spirit-Qi-Grammatik zugreifen kann. Hier ist einfach ein Beispiel, was ich versuche zu erreichen. (meine ganze Grammatik ist viel komplexer, dies ist ein einfaches Fragment, wo ich teste erwähnt Problem).
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;
}
Aber ich kann keine phoenix::get<> oder eine ähnliche Methode finden, um mit Phoenix auf boost::variant zuzugreifen. Der Grund, warum ich phoenix::get<> benötige, ist, dass ich eine Variante mit einem bestimmten Typ in die Liste einfügen und dann diesen spezifischen Typ als Referenz an die untergeordnete Regel als geerbtes Attribut übergeben muss:
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(')')
...
Gibt es eine Möglichkeit, dieses Verhalten zu erreichen?
Danke für jede Antwort
Rick