gpt4 book ai didi

c++ - 如何从 Spirit::Qi 规则访问 boost::variant 成员?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:57:34 25 4
gpt4 key购买 nike

在我的 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(')')
...

有什么方法可以实现这样的行为吗?

感谢任何回复

瑞克

最佳答案

编写您自己的“惰性”Phoenix 函数相当容易。这是一个用于 boost::variant 的。

#include <boost/variant.hpp>
#include <boost/spirit/include/phoenix.hpp>

template <typename Result>
struct get_impl
{
template <typename T>
struct result
{
typedef Result type;
};

template <BOOST_VARIANT_ENUM_PARAMS(typename T)>
Result operator()(boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> const& v) const
{
return boost::get<Result>(v);
}
};

ph::function<get_impl<int> > const get_int = get_impl<int>();

现在,这可以用在语义 Action 中:

... qi::eps [ get_int(ph::back(qi::_r1)) = ph::val(3) ]

关于c++ - 如何从 Spirit::Qi 规则访问 boost::variant 成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5077037/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com