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

Pau*_*nta 14 c++ boost variadic void-pointers

使用和提供什么固有的优势boost::anyboost::any_cast提供?void*dynamic_cast

Arm*_*yan 22

优点是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
Run Code Online (Sandbox Code Playgroud)

至于你的评论,你不能dynamic_cast来自void*.您dynamic_cast只能从指针和对具有至少一个虚函数的类类型的引用(也称为多态类型)


MSa*_*ers 13

boost::any 调用析构函数:

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


DXM*_*DXM 6

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

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

另外,正如其他人提到的那样<>非常类型安全,它会存储你想要的任何东西,但要找回它的唯一方法就是知道确切的类型或失败(当一个API给你无符号时,这可能有点烦人int和你的代码想要int被视为不同的类型).void*会让你做任何你想做的事情,如果你开始阅读或铺平堆和/或未初始化的内存,它不会阻止你甚至让你知道你正在这样做.


vis*_*tor 5

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

它支持复制任何值类型,并严格按照其类型安全检查该值.

这些都不能用a来完成void*.没有检查你,你必须知道自己可以投入到什么.

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