std::any 是C++17中类型安全的任意值容器,定义于头文件,可用于存储任意可复制类型,通过std::any_cast提取值并配合has_value()和指针形式避免异常,常用于配置系统、插件接口等需运行时类型灵活性的场景,但存在轻微性能开销且不应滥用。

在C++17中,std::any 是一个类型安全的容器,可以保存任意类型的单个值。它属于 std 命名空间,定义在 头文件中。当你需要在一个变量中存储不同类型的数据,又不想牺牲类型安全性时,std::any 就非常有用。
基本用法
你可以用任何可复制的类型初始化一个 std::any 对象。一旦赋值,可以通过 std::any_cast 来提取原始类型。
示例:
#include #includeint main() {std::any value = 42; // 存储 intstd::cout << std::any_cast(value) << 'n';
value = std::string{"Hello"}; // 替换为 stringstd::cout << std::any_cast(value) << 'n';value.reset(); // 清空值if (!value.has_value()) { std::cout << "No valuen";}
}
安全地访问值
直接使用 std::any_cast 提取不匹配的类型会抛出 std::bad_any_cast 异常。为了更安全,可以先检查类型或使用指针形式的 any_cast。
立即学习“C++免费学习笔记(深入)”;
推荐做法:
使用 has_value() 判断是否包含值使用指针版 std::any_cast(&any) 避免异常,失败返回 nullptr
示例:
std::any data = 3.14;// 安全访问if (auto p = std::any_cast(&data)) {std::cout << "Double: " << p << 'n';} else if (auto p = std::any_cast(&data)) {std::cout << "String: " << p << 'n';} else {std::cout << "Unknown typen";}
实际应用场景
std::any 常用于以下场景:
配置系统:配置项可能为整数、字符串、布尔等不同类型插件接口:传递通用参数包事件系统:携带任意附加数据的事件对象序列化/反序列化中间层
例如,构建一个简单的属性映射:
std::map config;config["port"] = 8080;config["host"] = std::string{"localhost"};config["enabled"] = true;// 使用时注意类型匹配if (config.find("port") != config.end()) {auto port = std::any_cast(config["port"]);}
基本上就这些。std::any 提供了便利和安全之间的良好平衡,但不应滥用——它牺牲了一部分编译期类型检查。尽量在确实需要运行时类型灵活性的地方使用。性能上,有轻微开销,包括堆分配(对大对象)和类型识别。不复杂但容易忽略细节。
以上就是c++++中的std::any如何使用_c++17类型安全的任意值容器的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1487858.html
微信扫一扫
支付宝扫一扫