全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

c++如何实现一个std::any c++安全存储任意类型【实例】

std::any是C++17引入的类型安全泛型容器,支持运行时类型检查与安全转换;它通过类型擦除持有可复制类型值,需用any_cast访问,禁止直接比较或未检查访问,推荐值语义取值并注意移动后空状态。

std::any 是 C++17 引入的标准库类型,用于安全地持有任意可复制(CopyConstructible)类型的值。它内部通过类型擦除实现,支持运行时类型检查、安全的类型转换和异常保护。下面是一个清晰、实用的实例讲解,涵盖基本用法、类型安全访问、常见陷阱及自定义封装建议。

基础用法:构造、赋值与类型查询

std::any 可以存储任意满足要求的类型(如 int、std::string、自定义类等),但不支持 void、引用、数组、抽象类或不可复制类型。

  • 构造方式多样:默认构造(空状态)、直接初始化、拷贝构造
  • 使用 type() 获取当前存储类型的 std::type_info&
  • has_value() 判断是否持有有效值
#include 
#include 
#include 

int main() {
    std::any a = 42;                    // int
    std::any b = std::string("hello");   // std::string
    std::any c;                          // 空状态

    std::cout << a.type().name() << "\n"; // 可能输出 "i"(依赖 ABI)
    std::cout << b.type().name() << "\n"; // 可能输出 "NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE"
    std::cout << std::boolalpha << c.has_value() << "\n"; // false
}

安全取值:any_cast 的两种形式

必须通过 std::any_cast 恢复原始类型,否则行为未定义。它提供引用版和值版,且会做运行时类型校验:

  • std::any_cast(any_obj):返回 T 值(要求 T 可复制;若类型不匹配抛 std::bad_any_cast
  • std::any_cast(&any_obj):返回 T&(避免拷贝,但需确保对象非 const 且生命周期足够)
  • 推荐优先使用值语义,除非明确需要引用或性能敏感场景
std::any x = 3.14;
if (x.type() == typeid(double)) {
    double d = std::any_cast(x); // 安全:类型匹配
    std::cout << d << "\n";
}

std::any y = true;
try {
    int i = std::any_cast(y); // 抛 std::bad_any_cast
} catch (const std::bad_any_cast& e) {
    std::cerr << e.what() << "\n";
}

实战技巧:避免常见错误

std::any 表面简单,但几个细节极易出错:

  • 不能直接比较两个 std::any 对象(无 operator==),需先 cast 再比
  • 移动后原对象变为 empty 状态,再次访问前必须检查 has_value()
  • 存储自定义类时,该类必须有公有拷贝构造函数(移动构造不影响 any 构造,但影响性能)
  • 避免存储 large object 而不加 const 引用 —— any_cast 总是拷贝,大对象考虑 any_cast

轻量封装:带类型名的日志化 any(可选增强)

为调试方便,可包装一个带类型信息打印能力的 wrapper:

#include 
#include 

struct debug_any {
    std::any data;
    
    template
    debug_any(T&& v) : data(std::forward(v)) {}
    
    template
    T get() const { 
        std::cout << "Getting as " << typeid(T).name() << "\n";
        return std::any_cast(data);
    }
    
    bool empty() const { return !data.has_value(); }
};

这样既保留 std::any 的安全性,又在开发期增加可观察性,上线时可替换为裸 std::any。


# app  # ai  # c++  # ios  # stream  # 标准库  # asic  # String  # Object  # 封装  # 构造函数  # const  # int  # void  # 存储类  # operator  # 泛型  # 类型转换  # 对象  # 自定义  # 是一个  # 有效值  # 擦除  # 几个  # 两种  # 可选  # 但不  # 不加  # 会做 


相关文章: 招商网站制作流程,网站招商广告语?  清除minerd进程的简单方法  建站之星×万网:智能建站系统+自助建站平台一键生成  如何在IIS中新建站点并配置端口与IP地址?  如何在阿里云虚拟主机上快速搭建个人网站?  桂林网站制作公司有哪些,桂林马拉松怎么报名?  Swift中switch语句区间和元组模式匹配  免费制作小说封面的网站有哪些,怎么接网站批量的封面单?  如何注册花生壳免费域名并搭建个人网站?  成都网站制作报价公司,成都工业用气开户费用?  C#怎么创建控制台应用 C# Console App项目创建方法  Python路径拼接规范_跨平台处理说明【指导】  Android自定义控件实现温度旋转按钮效果  天河区网站制作公司,广州天河区如何办理身份证?需要什么资料有预约的网站吗?  教学网站制作软件,学习*后期制作的网站有哪些?  php json中文编码为null的解决办法  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  如何通过cPanel快速搭建网站?  网站制作软件免费下载安装,有哪些免费下载的软件网站?  电脑免费海报制作网站推荐,招聘海报哪个网站多?  如何解决VPS建站LNMP环境配置常见问题?  如何在万网主机上快速搭建网站?  网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?  常州自助建站:操作简便模板丰富,企业个人快速搭建网站  山东网站制作公司有哪些,山东大源集团官网?  建站主机服务器选型指南与性能优化方案解析  公众号网站制作网页,微信公众号怎么制作?  如何选购建站域名与空间?自助平台全解析  视频网站app制作软件,有什么好的视频聊天网站或者软件?  较简单的网站制作软件有哪些,手机版网页制作用什么软件?  高端建站三要素:定制模板、企业官网与响应式设计优化  网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?  Android使用GridView实现日历的简单功能  哈尔滨网站建设策划,哈尔滨电工证查询网站?  企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?  建站之星后台密码遗忘如何找回?  招贴海报怎么做,什么是海报招贴?  如何破解联通资金短缺导致的基站建设难题?  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  昆明网站制作哪家好,昆明公租房申请网上登录入口?  制作门户网站的参考文献在哪,小说网站怎么建立?  寿县云建站:智能SEO优化与多行业模板快速上线指南  建站主机与服务器功能差异如何区分?  相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?  在线制作视频网站免费,都有哪些好的动漫网站?  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  赚钱网站制作软件,建一个网站怎样才能赚钱?是如何盈利的?  如何确保西部建站助手FTP传输的安全性?  昆明高端网站制作公司,昆明公租房申请网上登录入口?  如何在建站主机中优化服务器配置? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。