我正在使用 boost::any
结合 boost::any_cast<>
编写一些框架代码,它应该接受一组参数,几乎就像一个函数调用,并将它们转换成一个 boost::any
的数组。类型。
到目前为止,一切都运行良好,除了有些地方很难预测来电者给我的号码是签名还是未签名。我们现有产品(基于 Windows)中的很多代码使用 DWORD
和 BYTE
局部变量的数据类型,所以如果使用其中一个变量,我得到无符号类型。然而,如果一个常量是硬编码的,它很可能是一个简单的数字,在这种情况下它将被签名。
因为我无法预测我是否应该做 any_cast<int>
或 any_cast<unsigned int>
, 50% 的时间我的代码读取 boost::any
阵列将失败。
有谁知道是否有办法从 boost::any
中提取一个数字?不管原始类型是签名还是未签名?
最佳答案
没有办法; boost::any
执行最简单的类型删除形式,其中类型必须完全匹配。你可以自己写boost::any
-like 支持您想要的附加功能的类。我有 previously demonstrated如何做到这一点。
否则,您可以:
- 有两个代码路径,每个符号一个。 (如果
any_cast<unsigned T>
抛出,则切换到签名路径。) - 尝试未签名,如果抛出错误,请尝试签名和强制转换,使用单一代码路径。
- 让未签名的
any_cast
如果已签名,则抛出并强制用户应对。
然而,其中每一个都不是那么好。你真的需要boost::any
?也许你想要 boost::variant
相反,如果您需要特定的类型列表。
关于c++ - 如果您不知道原始类型是有符号的还是无符号的,有没有办法从 boost::any 中获取整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7695645/