gpt4 book ai didi

c++ - boost 变体的 spirit 传承

转载 作者:太空宇宙 更新时间:2023-11-04 11:36:51 25 4
gpt4 key购买 nike

难道不能从 boost::variant 继承并使用结果类作为选择运算符的结果吗?

struct jass_statement_node {
};

typedef boost::variant<
boost::recursive_wrapper<jass_set>
, boost::recursive_wrapper<jass_call>
, boost::recursive_wrapper<jass_ifthenelse>
, boost::recursive_wrapper<jass_loop>
, boost::recursive_wrapper<jass_exitwhen>
, boost::recursive_wrapper<jass_return>
, boost::recursive_wrapper<jass_debug>
> jass_statement_base;

struct jass_statement : public jass_statement_node, public jass_statement_base {
};

...

statement %=
set
| call
| ifthenelse
| loop
| exitwhen
| return_statement
| debug
;

导致 attr_cast 错误。如果我使用 base 作为属性,它可以工作,但我必须调整结构:

struct jass_statement : public jass_statement_node {
jass_statement_base value;
};

BOOST_FUSION_ADAPT_STRUCT(
jass_statement,
(jass_statement_base, value)
)

最佳答案

快速检查

#include <boost/spirit/include/qi.hpp>

using V = boost::variant<int, double, std::string>;

struct my_struct : V {
};

int main()
{
std::string const input("3.14151926");

auto f(begin(input)), l(end(input));
using namespace boost::spirit::qi;

V parsed;
bool ok = phrase_parse(
f, l,
lexeme [ '"' >> *~char_('"') >> '"' ] // string
| real_parser<double, strict_real_policies<double> >() // double
| int_ // well, int :)
, space, parsed);

return ok? 1 : 2;
}

确认这确实不是问题。因此,它与您的其他规则与变体元素类型的不完全兼容性有关。

您可以针对您的类型专门化分配/转换特征:

namespace boost { namespace spirit { namespace traits {

template <typename Exposed, typename Domain>
struct transform_attribute<Exposed, my_struct, Domain, void> :
transform_attribute<Exposed, V, Domain, void> {
using base_type = transform_attribute<Exposed, V, Domain, void>;
using typename base_type::type;

//static type pre(Exposed& val) { return base_type::pre(val); }
//static void post(Exposed& val, type attr) { base_type::post(val, attr); }
//static void fail(Exposed&e) { base_type::fail(e); }
};
} } }

你可以试试这个(我希望这次我没有把 ExposedTransformed 搞混:))

见上 Live On Coliru

关于c++ - boost 变体的 spirit 传承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22765838/

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