gpt4 book ai didi

c++ - 提升精神数字解析器并获得所需的综合属性

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

--edit -- 解决了问题:对最后一个旁注的评论会很有帮助。对 phoenix::bind 重载处理的评论也会有所帮助(在我的回答中)。

我在一个具有严格类型要求的系统上工作,我想确保我正在解析满足 int32_t 和 int64_t 约束的整数,我不希望解析器将解析的字符串合成并约束为上述类型.

我该怎么做? document提到long_long仅在支持 64 位的平台上可用,但我也需要在 32 位平台上解析 int64_t。

我的解析器摘录如下:

...
eps(_b == VALUE_INT4) >> qi::long_
[phoenix::bind(&AddEntry, _r1,_a, _1, _pass)] ) //
| ( eps(_b == VALUE_INT8) >> qi::long_long)
...

AddEntry 有一个 int32_t过载和一个int64_t过载,是一个 phoenix::static_cast__1为了 ?如果是这种情况,我如何在现代 32 位平台上解析 64 位整数?我假设 BOOST_HAS_LONG_LONG仅在 8008 等陈旧硬件上未定义;) .

<Rant>我希望他们坚持 c99 和 <boost/cstdint.hpp> 中规定的标准,我们大多数人都希望针对干净的抽象进行编程。数字解析器的定义方式可能有充分的理由。但是,可以在文档中更好地定义宏大计划的使用。 </Rant>

旁注:上面的条件 epsilon 样式在性能上是否与 case 语句相媲美?

最佳答案

1) Qi 解析器已经检查溢出条件。如果输入不能用组件应该匹配的类型表示,解析器组件将失败。例如,int_parser<int32_t, 10>对于不适合带符号的 32 位整数的数字将失败。

您可以使用 long_long解析器(即预定义的 64 位整数解析器)仅当 BOOST_HAS_LONG_LONG 时被定义为。如果您的平台不是这种情况,您仍然可以通过编写自己的包装器类型来模拟 64 位整数,以公开 Qi 数字解析器所期望的功能(参见 here),例如:

struct my_64bit_int {
//...
};
typedef int_parser<my_64bit_int, 10> my_64bit_int_parser_type;
my_64bit_int_parser_type const my_64bit_int_parser;

并将其用作:

my_64bit_int bigint;
parse(b, e, my_64bit_int_parser, bigint);

2) 你不能在不帮助编译器的情况下绑定(bind)重载函数,即给定:

void AddEntry(int32_t);
void AddEntry(int64_t);

如果你想为 int32_t 绑定(bind),你需要显式转换函数指针:

phoenix::bind((void(*)(int32_t))&AddEntry, _1);

对旁注的回答:否。备选解析器始终按照指定的相同顺序依次执行不同的备选方案,并在第一个匹配时停止。它的整体复杂度是O(N) , 其中N是单独备选方案的数量(参见 here )。

关于c++ - 提升精神数字解析器并获得所需的综合属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5566192/

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