为什么“boost::any”比“void*”好

Why is `boost::any` better than `void*`?

本文关键字:void any boost 为什么      更新时间:2023-10-16

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

优点是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_cast。只能从指向至少有一个虚拟函数(也称为多态类型)的类类型的指针和引用中dynamic_cast

boost::any调用析构函数:

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

不知怎么的,没有人提到boost::any<>充当值类型,其中as void*是一个指针。这意味着任何<>可以存储任意大小的任意对象。存储后,您可以传递任何<>的变量在任意位置键入;它靠自己生存。

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

另外,正如其他人提到的任何<>是非常类型安全的,它将存储您想要的任何东西,但获取它的唯一方法是知道确切的类型,否则它会失败(当一个API给您未签名的int,而您的代码希望int

这就是boost的参考所说的:

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

这两者都不能用void*来完成。没有支票给你,你必须知道你能投给什么。

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