c++如何实现一个std::any c++安全存储任意类型【实例】
发布时间 - 2025-12-30 00:00:00 点击率:次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
# 泛型
# 类型转换
# 对象
# 自定义
# 是一个
# 有效值
# 擦除
# 几个
# 两种
# 可选
# 但不
# 不加
# 会做
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】
JS碰撞运动实现方法详解
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】
Linux安全能力提升路径_长期防护思维说明【指导】
魔毅自助建站系统:模板定制与SEO优化一键生成指南
小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像
如何用好域名打造高点击率的自主建站?
怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?
个人摄影网站制作流程,摄影爱好者都去什么网站?
浅谈redis在项目中的应用
香港服务器如何优化才能显著提升网站加载速度?
七夕网站制作视频,七夕大促活动怎么报名?
Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】
进行网站优化必须要坚持的四大原则
Laravel中的withCount方法怎么高效统计关联模型数量
Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】
如何快速搭建高效服务器建站系统?
java获取注册ip实例
消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
Laravel如何实现模型的全局作用域?(Global Scope示例)
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
详解Android图表 MPAndroidChart折线图
如何在 Pandas 中基于一列条件计算另一列的分组均值
浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】
Java遍历集合的三种方式
Laravel如何处理异常和错误?(Handler示例)
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践
如何挑选高效建站主机与优质域名?
jquery插件bootstrapValidator表单验证详解
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】
如何快速生成专业多端适配建站电话?
Angular 表单中正确绑定输入值以确保提交与验证正常工作
三星网站视频制作教程下载,三星w23网页如何全屏?
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控
Python文件操作最佳实践_稳定性说明【指导】
SQL查询语句优化的实用方法总结
Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】
Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程
如何打造高效商业网站?建站目的决定转化率
如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】
HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】
Laravel如何实现全文搜索功能?(Scout和Algolia示例)
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
活动邀请函制作网站有哪些,活动邀请函文案?
Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?

