std::any 能存储任意可复制构造的类型,如 int、string 等,通过 std::any_cast 安全访问,避免 void* 类型转换风险,适用于需动态保存不同类型数据的场景。

在C++17中,std::any 是一个类型安全的容器,能够存储任意类型的值。它属于 头文件
std::any 能做什么?
std::any 可以持有任意可复制构造(CopyConstructible)的类型。比如 int、double、string、自定义类等都可以存进去。与 void* 不同,std::any 保留了类型信息,避免了手动类型转换带来的安全隐患。
常见使用场景包括:
- 函数返回多种可能类型的值
- 配置项或参数列表中混合不同类型的数据
- 实现类似脚本语言中的“万能变量”
基本用法示例
下面是一个简单的例子展示如何使用 std::any:
立即学习“C++免费学习笔记(深入)”;
#include#include #include int main() { std::any value = 42; // 存入 int std::cout << std::any_cast
(value) << '\n'; value = std::string{"Hello"}; // 替换为 string std::cout zuojiankuohaophpcnzuojiankuohaophpcn std::any_castzuojiankuohaophpcnstd::stringyoujiankuohaophpcn(value) zuojiankuohaophpcnzuojiankuohaophpcn '\n'; if (value.type() == typeid(std::string)) { std::cout zuojiankuohaophpcnzuojiankuohaophpcn "当前是字符串类型\n"; } try { auto num = std::any_cast(value); // 类型错误 } catch (const std::bad_any_cast&) { std::cout zuojiankuohaophpcnzuojiankuohaophpcn "类型转换失败\n"; } return 0; }
关键操作和注意事项
使用 std::any 时有几个核心点需要注意:
- 赋值和构造:可以直接用任意类型初始化或赋值
- 取出值必须用 std::any_cast:这是唯一安全的方式,若类型不匹配会抛出 std::bad_any_cast 异常
- 检查类型可用 .type():返回 const std::type_info&,可用于调试或条件判断
- 空状态:未初始化或被 reset 后的 any 对象处于空状态,此时 any_cast 也会抛异常
还可以通过指针形式进行 cast 来避免异常:
if (auto p = std::any_cast(&value)) { std::cout << "值为: " << *p << '\n'; }
基本上就这些。std::any 提供了类型安全的泛型存储能力,虽然性能上不如具体类型高效,但在需要灵活性的地方非常实用。注意合理使用,避免滥用导致类型失控。








