c++的std::any是什么 可以容纳任意类型的安全容器【详解】

admin 百科 13
std::any 是 C++17 引入的运行时类型安全泛型容器,可持有任意可复制类型的单个值,通过类型擦除实现,需用 std::any_cast 显式访问,支持空状态和移动语义。

c++的std::any是什么 可以容纳任意类型的安全容器【详解】-第1张图片-佛山资讯网

std::any 是 C++17 引入的一个类型安全的泛型容器,它能**在运行时持有任意可复制(CopyConstructible)类型的单个值**,并且支持类型检查与安全访问。

核心特性:类型安全 + 运行时擦除

std::any 不是模板类(不像 std::variant 或 std::optional 那样需编译时确定类型),而是一个具体类型。它内部使用类型擦除技术,把实际值及其类型信息一起封装起来。这意味着:

  • 可以存储 int、std::string、自定义 class、甚至 lambda(若可复制),只要满足可复制要求;
  • 不能直接读取内容,必须用 std::any_cast 显式指定目标类型来访问,否则抛出 std::bad_any_cast
  • 空状态合法(默认构造的 std::any 为空),可用 has_value() 判断是否含有效值。

基本用法:存、查、取

典型操作分三步:构造/赋值 → 检查类型 → 安全转换。

  • 赋值:std::any a = 42;a = std::string("hello");
  • 检查:if (a.type() == typeid(std::string)) { ... } 或更常用 a.has_value()
  • 取值:int x = std::any_cast<int>(a);</int>(成功);std::any_cast<double>(a)</double> 会抛异常

注意:std::any_cast<t>(a)</t> 要求 T 与内部存储类型完全一致(包括 const/volatile 限定符),不支持隐式转换。

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

标签: c++ 隐式转换 red

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~