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

在C++17中,std::any 是一个类型安全的容器,可以保存任意类型的单个值。它属于 std 命名空间,定义在
你可以用任何可复制的类型初始化一个 std::any 对象。一旦赋值,可以通过 std::any_cast 来提取原始类型。
示例:
#include <any>
#include <iostream>
<p>int main() {
std::any value = 42; // 存储 int
std::cout << std::any_cast<int>(value) << '\n';</p><pre class="brush:php;toolbar:false;">value = std::string{"Hello"}; // 替换为 string
std::cout << std::any_cast<std::string>(value) << '\n';
value.reset(); // 清空值
if (!value.has_value()) {
std::cout << "No value\n";
}}
直接使用 std::any_cast 提取不匹配的类型会抛出 std::bad_any_cast 异常。为了更安全,可以先检查类型或使用指针形式的 any_cast。
立即学习“C++免费学习笔记(深入)”;
推荐做法:
示例:
std::any data = 3.14;
<p>// 安全访问
if (auto<em> p = std::any_cast<double>(&data)) {
std::cout << "Double: " << </em>p << '\n';
} else if (auto<em> p = std::any_cast<std::string>(&data)) {
std::cout << "String: " << </em>p << '\n';
} else {
std::cout << "Unknown type\n";
}
std::any 常用于以下场景:
例如,构建一个简单的属性映射:
std::map<std::string, std::any> config;
config["port"] = 8080;
config["host"] = std::string{"localhost"};
config["enabled"] = true;
<p>// 使用时注意类型匹配
if (config.find("port") != config.end()) {
auto port = std::any_cast<int>(config["port"]);
}
基本上就这些。std::any 提供了便利和安全之间的良好平衡,但不应滥用——它牺牲了一部分编译期类型检查。尽量在确实需要运行时类型灵活性的地方使用。性能上,有轻微开销,包括堆分配(对大对象)和类型识别。不复杂但容易忽略细节。
以上就是c++++中的std::any如何使用_c++17类型安全的任意值容器的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号