boost::any
和boost::any_cast
提供了哪些优于使用void*
和dynamic_cast
的优势?
答案 0 :(得分:22)
优点是boost::any
比void*
更安全,类型安全。
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
根本没有进入图片,因为它与这两者都没有直接关系。