16

与使用and相比,boost::anyboost::any_cast提供了哪些固有优势?void*dynamic_cast

4

4 回答 4

27

优点是它boost::anyvoid*.

例如

int i = 5;
void* p = &i;
static_cast<double*>(p);  //Compiler doesn't complain. Undefined Behavior.
boost::any a;
a = i;
boost::any_cast<double>(a); //throws, which is good

至于您的评论,您不能dynamic_castvoid*. 您dynamic_cast只能从具有至少一个虚函数(又名多态类型)的类类型的指针和引用

于 2012-01-06T12:05:05.670 回答
15

boost::any调用析构函数:

{
    boost::any x = std::string("Hello, world");
    x = std::wstring(L"Goodbye"); // string::~string called here
} // wstring::~wstring called here
于 2012-01-06T12:38:45.577 回答
8

不知何故,没有人提到 boost::any<> 充当值类型,而 void* 是指针。这意味着 any<> 可以存储任何大小的任何对象。存储后,您可以将任何<> 类型的变量传递到您想要的任何地方;它独自生活。

另一方面 void* 是指针大小,因此您必须确保 sizeof (your data) <= sizeof(void*) 或您的 void* 只是指向存储在其他地方的真实数据的指针。但在这种情况下,它与 any<> 完全不同,因为现在您需要担心“其他地方”并确保只要 void* 有效它就保持有效,这有时可能会成为一个挑战,尤其是在多线程应用程序中.

另外,正如其他人提到的那样, any<> 是非常安全的类型,它会存储您想要的任何内容,但是找回它的唯一方法是知道确切的类型,否则它会失败(当一个 API 给您unsigned时,这可能会有点烦人int并且您的代码想要int被视为不同的类型)。void* 会让你用它做任何你想做的事情,如果你开始阅读或铺路堆和/或未初始化的内存,它不会阻止你甚至让你知道你正在这样做。

于 2012-01-25T05:05:25.543 回答
5

这就是 boost 的参考资料所说的:

它支持复制任何值类型并严格根据其类型安全检查提取该值。

这些都不能用void*. 没有任何支票适合您,您必须知道自己可以将其投射到什么位置。

我认为根本没有dynamic_cast进入图片,因为它与任何一个都没有直接关系。

于 2012-01-06T12:13:34.770 回答