C++中any类型怎么用_C++17存储任意类型变量方法【进阶】-C++

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() 字符串比较(不可靠、平台相关),而应:

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » C++中any类型怎么用_C++17存储任意类型变量方法【进阶】-C++
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4004587+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4004587+
  • 本周更新: 0+
  • 最后更新: 2026-03-16