为啥 `boost::any` 比 `void*` 更好?

Posted

技术标签:

【中文标题】为啥 `boost::any` 比 `void*` 更好?【英文标题】:Why is `boost::any` better than `void*`?为什么 `boost::any` 比 `void*` 更好? 【发布时间】:2012-02-04 03:53:52 【问题描述】:

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

【问题讨论】:

你不能从dynamic_castvoid* @ArmenTsirunyan 我一直认为这是可能的,尽管我从未尝试过......:| @PaulManta 关于Armen 的评论,你可以看看这个问题***.com/questions/6771998/dynamic-cast-of-void boost::any 的魔力会带来一些性能成本。 felipedelamuerte.wordpress.com/2012/04/06/… 【参考方案1】:

优点是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

至于您的评论,您不能通过void*dynamic_castdynamic_cast 只能通过指针和对至少具有一个虚函数(又名多态类型)的类类型的引用来实现

【讨论】:

是的,但那是静态演员表,而不是动态演员表。您不能在void* 上使用dynamic_cast 的评论是一个更好的答案。或者你的意思是没有什么能阻止你使用static_cast,即使你不应该? :) @Paul:将那部分添加到我的答案中【参考方案2】:

boost 的参考资料是这样说的:

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

这些都不能用void* 完成。没有适合您的检查,您必须知道自己可以将其投射到什么位置。

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

【讨论】:

【参考方案3】:

boost::any 调用析构函数:


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

【讨论】:

【参考方案4】:

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

另一方面 void* 是指针大小,因此您必须确保 sizeof (your data) 完全不同,因为现在您需要担心“其他地方”并确保只要 void* 有效它就保持有效,这有时可能会成为一个挑战,尤其是在多线程应用程序中.

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

【讨论】:

以上是关于为啥 `boost::any` 比 `void*` 更好?的主要内容,如果未能解决你的问题,请参考以下文章

`boost::any` 和 `std::any` 之间的区别

如何定义 boost::any 运算符 ==

boost::any_cast 到我的自定义类

boost::any_cast - 仅在隐式转换不可用时抛出?

boost::ptr_vector 和 boost::any 的问题

Boost--any