--edit -- 解决了这个问题:对最后一个旁注的评论会很有帮助。对 phoenix::bind 重载处理的评论也会有所帮助(在我的回答中)。
我正在开发一个具有严格类型要求的系统,我想确保我正在解析满足 int32_t 和 int64_t 约束的整数,我不希望解析器合成并将解析的字符串限制为提到的类型。
我该怎么做?该文档提到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_ on _1
order 吗?如果是这种情况,我如何在现代 32 位平台上解析 64 位整数?我假设仅在8008BOOST_HAS_LONG_LONG
等过时的硬件上未定义;)。
<Rant>
我希望他们坚持 c99 中规定的标准,并且<boost/cstdint.hpp>
我们大多数人都希望针对干净的抽象进行编程。以它们的方式定义数字解析器可能有充分的理由。但是,可以在文档中更好地定义宏计划的使用。
</Rant>
附带说明:上面的条件 epsilon 样式是否在性能上与 case 语句相媲美?