C++是一个静态键入语言。 boost::any
的类型是运行时的值;任何特定的any
都可以有任何类型。这是有点点。
没有any::type_value
,因为那必须是编译时间的值。而any
是一个运行时构造。
考虑一下:
void TakeAnAny(boost::any a)
{
a::type_value& i2 = any_cast<a::type_value &>(a);
}
是什么类型any::type_value
?用TakeAnAny
虚拟任何类型是合法的。没有一个编译时类型可以减少到any::type_value
。因此,编译器无法确定类型。由于C++是静态类型的,因此你会被弄糊涂。
任何类型的最终目的是擦除。我有一些价值。我想把它传递给其他功能。这个过程将经过几个不同的通信层。但我不一定希望所有这些不同的图层都知道我正在使用哪种类型的图层。我只需要我自己和我的预定目的地知道类型。所以你坚持在any
,你很好。其他人都看到了any
,你们都知道它的包装。
此过程仅适用于源和目标都知道值的实际类型。如果你不知道类型,那么你不应该使用any
。 any
的目的是没有一个功能坐在那里,并将其投掷到一堆可能的类型(这就是boost::variant
是什么)。目的是从函数的签名中删除该类型。
这允许像通用消息和信号的东西。您使用系统注册一些事件处理程序。您触发以any
作为参数的事件。发起事件的人知道“MouseClick”事件总是以vec2
作为参数。因此,每个“MouseClick”处理程序都将其转换为vec2
。 “KeyPress”活动可能会通过int32_t
。所以这些处理程序将其转换为该类型。等等。每个人都知道它实际需要什么类型。
这曾经与void*
完成。存在的问题是您拥有所有权问题(any
是一个值,而void*
是一个指针)。此外,void*
是这样删除类型,无法检查,看看你的演员是否正确。 any
实际上只是一种类型&价值安全void*
;它可以防止你输入错误的类型。
你真的不想要any
。您的使用案例似乎也不需要variant
。你似乎想要的是模板。这是一种不同的东西,它可以让你做你想做的事:有一个可以使用任何特定类型的函数,但仍然能够确切地知道该类型是什么。
当然,模板有其自身的局限性。
您只需使用Boost.Any就可以做到这一点,所以使用Boost.Variant将会是最基本的答案。 – ildjarn 2012-02-02 00:17:24
*为什么*你需要这样做? – GManNickG 2012-02-02 00:25:30