为什么`boost :: any`比`void *更好?

时间:2012-01-06 12:01:06

标签: c++ boost void-pointers variadic

boost::anyboost::any_cast提供了哪些优于使用void*dynamic_cast的优势?

4 个答案:

答案 0 :(得分:22)

优点是boost::anyvoid*更安全,类型安全。

E.g。

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_cast void*。你只能从指针和对至少有一个虚函数(也就是多态类型)的类类型的引用dynamic_cast

答案 1 :(得分:13)

boost::any调用析构函数:

{
    boost::any x = std::string("Hello, world");
    x = std::wstring(L"Goodbye"); // string::~string called here
} // wstring::~wstring called here

答案 2 :(得分:6)

不知怎的,没有人提到过boost :: any&lt;&gt;充当值类型,其中void *是指针。这意味着任何&lt;&gt;可以存储任何大小的任何对象。存储后,您可以传递任何&lt;&gt;的变量随心所欲地输入;它靠它自己生活。

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

正如其他人提到的那样&lt;&gt;是非常类型安全的,它会存储你想要的任何东西,但是找回它的唯一方法是知道确切的类型或它失败(当一个API给你 unsigned int 时,这可能有点烦人并且您的代码希望 int 被视为不同的类型)。 void *会让你做任何你想做的事情,如果你开始阅读或铺平堆积和/或未初始化的记忆,它不会阻止你甚至让你知道你正在这样做。

答案 3 :(得分:5)

这是boost的参考文献所说的:

  

它支持复制任何值类型和安全检查提取   该值严格违背其类型。

这些都不能用void*来完成。没有对你的检查,你必须知道自己可以投入的内容。

我认为dynamic_cast根本没有进入图片,因为它与这两者都没有直接关系。