std::any通过类型擦除和运行时检查实现任意类型安全存储,区别于void*和union的手动类型管理及std::variant的编译时类型限定,适用于配置系统、插件架构等动态场景,但需注意堆分配和类型检查带来的性能开销,优先使用std::variant或具体类型以提升性能。

在C++中,
std::any
std::any
使用
std::any
<any>
std::any
std::any_cast
这东西用起来其实挺直观的。你先得
include <any>
std::any
std::any my_data;
当你需要存储一个值时,直接赋值就行了,它会自动处理类型擦除:
立即学习“C++免费学习笔记(深入)”;
#include <any>
#include <string>
#include <iostream>
#include <vector>
int main() {
std::any my_data; // 创建一个空的any对象
my_data = 42; // 存储一个int
std::cout << "存储了int: " << std::any_cast<int>(my_data) << std::endl;
my_data = std::string("Hello, std::any!"); // 存储一个std::string
std::cout << "存储了string: " << std::any_cast<std::string>(my_data) << std::endl;
my_data = std::vector<double>{1.1, 2.2, 3.3}; // 存储一个std::vector<double>
// 取出并打印vector的第一个元素
std::cout << "存储了vector,第一个元素是: " << std::any_cast<std::vector<double>>(my_data)[0] << std::endl;
// 尝试取出不存在的类型会抛出std::bad_any_cast异常
try {
std::cout << std::any_cast<char*>(my_data) << std::endl;
} catch (const std::bad_any_cast& e) {
std::cerr << "捕获到异常: " << e.what() << std::endl;
}
// 检查是否有值,以及当前存储的类型
if (my_data.has_value()) {
std::cout << "my_data当前有值,类型是: " << my_data.type().name() << std::endl;
}
my_data.reset(); // 清空any对象
if (!my_data.has_value()) {
std::cout << "my_data已经被清空。" << std::endl;
}
return 0;
}这段代码展示了
std::any
any_cast
has_value()
type()
any_cast
std::bad_any_cast
这个问题问得好,因为很多时候我们看到
std::any
在我看来,
std::any
void*
void*
std::any
any_cast
union
std::any
而
std::variant
std::any
std::variant
std::variant<int, std::string, double>
std::any
std::variant
std::any
说白了,
void*
union
std::variant
std::any
std::any
我个人觉得,最典型的应用场景就是配置系统。想象一下,你的应用程序需要从配置文件(比如JSON、YAML)中读取各种设置,有些是整数,有些是字符串,有些是布尔值,甚至可能是更复杂的自定义对象。如果用一堆
if-else
switch
std::map<std::string, std::any>
std::any
any_cast
另一个我能想到的地方是插件系统或扩展架构。当你的主程序需要加载外部插件,而这些插件可能会返回各种不同类型的数据时,
std::any
std::any
事件系统中的事件数据载荷也是一个好例子。不同的事件可能携带不同结构的数据。一个
Event
std::any payload;
MouseClickEvent
MouseCoords
KeyboardEvent
KeyCode
any_cast
payload
当然,也要警惕过度使用。如果你的数据类型是固定的几个,或者你可以通过多态(继承)来解决,那么
std::any
std::any
简单来说,如果存储的类型足够小(比如
int
char
std::any
std::any
std::string
std::vector
std::any
此外,每次使用
std::any_cast
基于这些考量,我总结了一些使用
std::any
std::variant
std::variant
std::any
any_cast
std::any
any_cast
auto& val = std::any_cast<MyType>(my_any);
val
std::any
std::any
std::any
std::any
std::any
std::any
std::any
std::any
总之,
std::any
以上就是C++如何使用std::any存储任意类型数据的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号