有没有办法从 boost::any 中获取一个整数,如果您不知道原始类型是有符号的还是无符号的

Is there a way get an integer out of boost::any if you don't know if original type was signed or unsigned

本文关键字:不知道 如果 原始 无符号 符号 整数 类型 一个 boost any 获取      更新时间:2023-10-16

我使用boost::anyboost::any_cast<>相结合来编写一些框架代码,这些代码应该采用一组参数,几乎像函数调用,并将它们转换为boost::any类型的数组。

到目前为止,一切都很顺利,除了在很难预测来电者给我的号码是有符号的还是无符号的地方。我们现有产品(基于windows)中的许多代码使用DWORDBYTE数据类型作为局部变量,因此如果使用其中一个变量,我将获得unsigned类型。但是,如果常量是硬编码的,那么它最有可能是一个简单的数字,在这种情况下它将被带符号。

因为我不能预测我应该做any_cast<int>还是any_cast<unsigned int>, 50%的时间我的代码读取boost::any数组将失败。

有没有人知道,如果有一种方法,只是一个数字的boost::any,无论原始类型是有符号或无符号?

没有办法;boost::any执行最简单的类型擦除,类型必须完全匹配。您可以编写自己的类似boost::any的类来支持所需的其他特性。我之前已经演示了如何做到这一点。

如果做不到,你可以:

  1. 有两个代码路径,每个符号一个。(如果any_cast<unsigned T>抛出,则切换到签名路径)
  2. 尝试无符号,如果抛出,尝试有符号和强制转换,使用单个代码路径
  3. 只要让unsigned any_cast抛出,如果它是签名的,并强制用户处理。

然而,这些都不是真的那么好。你真的需要boost::any吗?如果你想要一个特定的类型列表,也许你想要boost::variant

相关文章: