std::any是C++17引入的类型擦除容器,用于安全持有运行时类型不确定但需类型安全的任意可复制/移动值;适用于插件传参、配置解析等场景,禁用于同类型高频存储或替代variant/void*。
std::any 是什么,什么时候该用它
std::any 是 C++17 引入的类型擦除容器,用来安全地持有任意可复制(或可移动)类型的值。它不是万能替代 void* 或 union 的工具,而是为“运行时类型不确定、但需严格类型安全”的场景设计的——比如插件系统传参、配置项解析、反射辅助结构。
常见错误现象:用 std::any 存大量同类型数据(如一堆 int),结果性能暴跌、代码冗长;或者没检查就直接 any_cast,触发 std::bad_any_cast 异常。
- 它内部用小对象优化(SOO),小类型(如
int、bool)通常不堆分配 - 不支持不完整类型、抽象类、数组类型(如
int[5])、带删除拷贝/移动的类型 - 不能直接比较两个
std::any是否“逻辑相等”,需手动取出后比
怎么存、取、判断类型——三个核心操作
存值很简单:std::any 构造函数和 emplace 都支持:
std::any a = 42; // 推导为 int
std::any b = std::string("hello"); // 推导为 std::string
std::any c;
c.emplace(3.1415); // 显式指定类型并就地构造
取值必须用 std::any_cast,且有三种写法:
立即学习“C++免费学习笔记(深入)”;
-
std::any_cast(any_obj):返回T&,失败抛std::bad_any_cast -
std::any_cast(&any_obj):返回T*,失败返回nullptr(推荐用于不确定类型时) -
std::any_cast(std::move(any_obj)):用于移动语义提取(原any置为空)
判断类型是否匹配,别用 type().name() 字符串比较(不可靠、平台相关),而应: