C++如何使用std::any存储任意类型?(C++17新特性)

admin 百科 13
std::any是C++17引入的类型安全容器,用于运行时存储任意可复制类型的值;需显式指定类型取值,推荐用指针版std::any_cast判空避免异常。

C++如何使用std::any存储任意类型?(C++17新特性)-第1张图片-佛山资讯网

std::any 是 C++17 引入的类型安全容器,用于在运行时存储任意可复制(CopyConstructible)类型的值。它不是“万能指针”,也不是类型擦除的黑盒——它明确要求类型必须可拷贝,且提供安全的取值机制,避免了 void* 或裸联合体的手动管理风险。

基本用法:构造、赋值与取值

创建 std::any 对象后,可用任意支持拷贝的类型初始化或赋值;取值必须显式指定目标类型,否则抛出 std::bad_any_cast 异常。

  • 直接构造:std::any a = 42;(自动推导为 int
  • 显式构造:std::any b(std::string("hello"));
  • 重新赋值:a = 3.14;(内部先销毁旧值,再构造新值)
  • 安全取值:int x = std::any_cast<int>(a);</int>(仅当 a 当前存的是 int 才成功)
  • 检查类型:if (a.type() == typeid(double)) { ... } 或用 std::any_cast<t>(&a)</t> 返回指针(空指针表示类型不匹配)

避免常见错误:类型不匹配与空值处理

std::any_cast<t>(any_obj)</t> 直接返回值的方式在类型不符时会抛异常;更健壮的做法是使用指针重载版本进行判空检查。

  • ❌ 危险写法:auto s = std::any_cast<:string>(a);</:string> —— 若 a 不是 string,程序崩溃
  • ✅ 安全写法:if (auto p = std::any_cast<:string>(&a)) { std::cout </:string>
  • 注意:std::any 可以为空(默认构造),a.has_value() 可判断是否含有效值
  • 清空内容:a.reset(); 或赋值 std::any{}

适用场景与性能提醒

std::any 适合需要统一接口但类型动态变化的场合,比如配置表、插件参数、反射简易实现等。但它不是高性能通用容器。

标签: c++

发布评论 0条评论)

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