为什么“boost::any”比“void*”好
Why is `boost::any` better than `void*`?
与使用void*
和dynamic_cast
相比,boost::any
和boost::any_cast
具有哪些固有优势?
优点是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
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
根本没有进入画面,因为它与两者都没有直接关系。
相关文章:
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 在c++类上调用void函数
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 在派生函数中指定void*参数
- C++为什么尽管我调用了void函数,它却不起作用
- 如何从void函数输出字符串
- 我应该使用什么来代替void作为变体中的替代类型之一
- 奇怪的结构&GCC&clang(void*返回类型)
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- 为什么这个函数将"const char*"转换为"void* const"而不是"const void*"
- 引用一个已擦除类型(void*)的指针
- 将尾部调用void(i32,..)位转换为llvm::函数以获取FnAttribute
- 库函数需要一个 std::function<void(void)>,如何传入类函数?
- 如何将指针从一个void函数传递到另一个C++
- 为什么我在使用void函数时得到错误代码C2276
- void*到驱动程序中的UnicodeString
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- 指针没有更新它在void函数内部指向的值
- 获取 void* 指向 boost::any 内容的指针
- 为什么“boost::any”比“void*”好