gpt4 book ai didi

c++ - Boost.Fusion 适配结构中默认值的 Boost.Spirit.Qi 语法

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

struct coordinate {
int x;
int y;
int z;
};

BOOST_FUSION_ADAPT_STRUCT(
coordinate,
(int, x)
(int, y)
(int, z)
)

template <typename Iterator>
struct coordinate_grammar : qi::grammar<Iterator, coordinate(), ascii::space_type>
{
coordinate_grammar()
:
coordinate_grammar::base_type(start),
optional_x(-(qi::int_ >> ':')),
optional_z(-('@' >> qi::int_)),
start(optional_x >> qi::int_ >> optional_z)
{
}

qi::rule<Iterator, int, ascii::space_type> optional_x;
qi::rule<Iterator, int, ascii::space_type> optional_z;
qi::rule<Iterator, coordinate(), ascii::space_type> start;
};

我想设置0作为默认值 x , 和 1000作为默认值 z .

输入 --> 期望的输出:

  • 200:400@300 --> [200,400,300]
  • 200:400 --> [200,400,1000]
  • 400@300 --> [0,400,300]
  • 400 --> [0,400,1000]

当没有为可选的(optional_xoptional_z) 解析器指定值时,我需要如何修改规则语法以提供默认值?

最佳答案

诀窍是重新考虑“可选”的概念......

optional_x(-(qi::int_ >> ':')),
optional_z(-('@' >> qi::int_)),

我们知道,- 前缀表示此规则可以指定 0 次或 1 次,因此它是可选的。

但是,我们实际上并不希望有一个“可选”值。我们想要已解析的值或默认值。这不是可选的,它只是一个或另一个。

通过修改规则语法,什么时候可以更好的描述我们的意图。

optional_x((qi::int_ >> ':') | qi::attr(0)),
optional_z(('@' >> qi::int_) | qi::attr(1000)),

现在当处理选项时,如果您没有为 xz 提供值,那么 qi 将代表您提供一个值:attr(...).

关于c++ - Boost.Fusion 适配结构中默认值的 Boost.Spirit.Qi 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51216925/

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