2

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

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

由于我无法预测是否应该执行any_cast<int>or any_cast<unsigned int>,因此读取boost::any数组的代码有 50% 的时间会失败。

有谁知道boost::any无论原始类型是签名还是未签名,是否有办法只计算一个数字?

4

1 回答 1

2

没有办法;boost::any执行最简单形式的类型擦除,其中类型必须完全匹配。您可以编写自己boost::any的类来支持您想要的附加功能。我之前已经演示过如何做到这一点。

如果做不到这一点,您可以:

  1. 有两个代码路径,每个符号一个。any_cast<unsigned T>(如果抛出,切换到签名路径。)
  2. 尝试未签名,如果抛出,尝试签名和强制转换,使用单个代码路径。
  3. 如果已签名,只需让 unsignedany_cast抛出,并强制用户应对。

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

于 2011-10-08T08:30:19.137 回答