我花了一段时间才弄清楚这一点,但语义boost::any
令人困惑。
对于值类型,您可以像这样使用它:
int value = 100;
boost::any something;
something = value;
//...later...
int value = boost::any_cast<int>(&something);
此代码清晰且有意义,但在value
内部存储为副本。这意味着对于我放置在其中的较大对象boost::any
,它们将被复制。此外,我用它替换的任何函数void*
都期望在我修改对象中包含的值时修改函数外部的值boost::any
(这不会发生,因为它复制了它)。
因此,如果我将指针放入其中,事情就会变得很奇怪:
int value = 100;
boost::any something;
something = &value;
//...later...
int* value = *boost::any_cast<int*>(&something);
在这种情况下,我必须取消引用返回值,因为boost::any_cast
返回int**
!我也没有检查过,但我认为如果something.empty() == true
. 这根本不简单。
我不想在我boost::any
的void*
. 指针,指针,混合了一些类型安全。基本上我想要的是boost::any_pointer
,或类似的东西。有没有办法禁止boost::any
接受除指针以外的任何东西?如果没有,是否有替代方案boost::any
可以为我提供我正在寻找的语义?