为啥 `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::any
和 boost::any_cast
提供了哪些固有优势?
【问题讨论】:
你不能从dynamic_cast
void*
@ArmenTsirunyan 我一直认为这是可能的,尽管我从未尝试过......:|
@PaulManta 关于Armen 的评论,你可以看看这个问题***.com/questions/6771998/dynamic-cast-of-void
boost::any 的魔力会带来一些性能成本。 felipedelamuerte.wordpress.com/2012/04/06/…
【参考方案1】:
优点是boost::any
比void*
更安全。
例如
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_cast
。 dynamic_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_cast - 仅在隐式转换不可用时抛出?