c++怎么使用STL中的any类型_c++17万能容器【核心】-C++

std::any是c++17引入的类型安全单值容器,可存储任意可复制构造类型(如int、std::string、自定义类、std::vector等),但不支持纯右值引用或不可复制类型。

std::any 是什么,能存哪些值

std::any 是 C++17 引入的类型安全容器,用来存储任意可复制(CopyConstructible)类型的单个值。它不是“万能容器”意义上的集合,而是一个“单值泛型盒子”——只能装一个东西,且必须明确知道怎么取出来。

  • 可以存 int、std::string、自定义类(满足可复制)、甚至 std::vector<double></double>
  • 不能存纯右值引用、不满足复制构造的类型(如含 deleted 拷贝构造函数的类)
  • 不支持直接比较两个 std::any 是否相等(需手动 type() 判断后转型再比)
  • 存 nullptr 是合法的,但存裸指针(如 int*)本身没问题,只是要自己管理生命周期

常见误用:把它当 std::vector<:any></:any> 用作动态类型数组——这可行但性能差、易出错,不是设计本意。

怎么安全地存和取值

存值很简单:std::any 构造或赋值即可;取值必须显式使用 std::any_cast,否则运行时报 std::bad_any_cast。

std::any a = 42;
std::any b = std::string("hello");
<p>// ✅ 正确取值:类型匹配
int x = std::any_cast<int>(a);                    // OK
std::string s = std::any_cast<std::string>(b);     // OK</p><p>// ❌ 错误:类型不匹配 → 抛 std::bad_any_cast
// double d = std::any_cast<double>(a);</p><p>// ✅ 安全取值:先检查类型再 cast
if (a.type() == typeid(int)) {
int y = std::any_cast<int>(a);
}
  • std::any_cast<t>(any_obj)</t> 要求 T 和实际存储类型完全一致(包括 const/volatile 限定符)
  • 支持指针形式 std::any_cast<t>>(&any_obj)</t>,返回 T,失败时返回 nullptr,适合避免异常
  • 不要用 std::any_cast<void>(...)</void> —— 这是未定义行为

和 void* / union / boost::any 对比有什么坑

  • 和 void* 比:std::any 自动管理内存和析构,类型信息在运行时保留,但有约 2–3 倍空间开销(内部通常用 small buffer optimization + heap fallback)

    立即学习“C++免费学习笔记(深入)”;

  • 和 union 比:不需要手动维护活跃字段,但失去编译期类型检查和零成本抽象

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

本站指数

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