Any类(C++17类型擦除,也称上帝类)
Any类(C++17类型擦除,也称上帝类)
在C++中,std::any
是C++17标准引入的一个灵活的类型安全容器,用于存储任意类型的单个值。
1. std::any
的核心特性
- 类型安全:存储的值必须通过明确的类型转换(
any_cast
)访问,否则会抛出异常。 - 值语义:
any
对象管理其内部存储的值的生命周期,拷贝时会深拷贝存储的值。 - 小对象优化(SOO):大多数实现会在栈上直接存储小对象,避免堆分配的开销。
- 类型擦除:隐藏具体类型,但保留运行时类型信息(RTTI)。
2. 基本用法
2.1 包含头文件
#include <any>
2.2 存储值
std::any data;data = 42; // 存储int
data = std::string("Hello"); // 存储string
data = 3.14; // 存储double
2.3 检查是否有值
if (data.has_value()) {std::cout << "Data contains a value.\n";
}
2.4 获取值的类型
const std::type_info& type = data.type();
std::cout << "Type: " << type.name() << "\n"; // 输出类似"i"(int)或"d"(double)
2.5 安全地获取值(any_cast
)
try {int value = std::any_cast<int>(data);std::cout << "Value: " << value << "\n";
} catch (const std::bad_any_cast& e) {std::cerr << "Wrong type: " << e.what() << "\n";
}
2.6 重置值
data.reset(); // 清空内容
3. 高级用法
3.1 存储复杂对象
struct Point { int x, y; };
std::any pt = Point{10, 20};// 通过指针访问(不抛出异常)
if (auto* p = std::any_cast<Point>(&pt)) {std::cout << "Point: (" << p->x << ", " << p->y << ")\n";
}
3.2 移动语义
std::string str = "Hello";
std::any a = std::move(str); // 移动构造,str变为空
3.3 自定义类型支持
任何可拷贝构造的类型均可存储:
class MyClass {
public:MyClass(int v) : value(v) {}
private:int value;
};std::any obj = MyClass(42);
4. 与类似技术的对比
特性 | std::any | std::variant | void* |
---|---|---|---|
类型安全 | ✔️ | ✔️ | ❌ |
存储类型数量 | 任意 | 编译时固定 | 任意 |
类型检查 | 运行时(type() ) | 编译时 | 无 |
内存管理 | 自动 | 自动 | 手动 |
适用场景 | 动态类型需求 | 已知有限类型集合 | 低级操作 |
5. 实现原理简析
- 类型擦除:通过内部模板类保存类型信息和值。
- 小对象优化:栈存储小对象,堆存储大对象。
- 虚函数分发:使用虚函数处理拷贝、析构和类型查询。
6. 注意事项
- 性能:频繁的类型检查或大型对象存储可能影响性能。
- 异常安全:错误的
any_cast
会抛出std::bad_any_cast
。 - 类型一致性:必须精确匹配存储类型(如
int
与long
视为不同)。
7. 实际应用场景
- 配置系统:存储不同类型的配置参数(如int、string、bool)。
- 消息传递:在事件总线上传递多种类型的消息。
- 插件架构:处理来自不同模块的未知数据类型。
8. 示例代码:异构容器
#include <any>
#include <vector>
#include <iostream>int main() {std::vector<std::any> container;container.push_back(42);container.push_back(3.14);container.push_back(std::string("C++17"));for (const auto& elem : container) {if (elem.type() == typeid(int)) {std::cout << "Int: " << std::any_cast<int>(elem) << "\n";} else if (elem.type() == typeid(double)) {std::cout << "Double: " << std::any_cast<double>(elem) << "\n";} else if (elem.type() == typeid(std::string)) {std::cout << "String: " << std::any_cast<std::string>(elem) << "\n";}}return 0;
}
输出:
Int: 42
Double: 3.14
String: C++17
9. 总结
std::any
为C++提供了灵活的类型安全存储机制,适用于需要运行时处理未知类型的场景。尽管它牺牲了一定的性能(类型检查和存储开销),但在设计动态系统时非常有用。使用时需注意类型匹配和异常处理,避免滥用。
相关文章:
Any类(C++17类型擦除,也称上帝类)
Any类(C17类型擦除,也称上帝类) 在C中,std::any 是C17标准引入的一个灵活的类型安全容器,用于存储任意类型的单个值。 1. std::any 的核心特性 类型安全:存储的值必须通过明确的类型转换(any_…...
jquery.table2excel方法导出
jquery提供了一个table2excel方法可以用来导出页面到xls等 $("#grid_595607").table2excel({exclude: ".noExport", // 排除类名为 noExport 的元素filename: "导出数据.xls",exclude_img: true, // 不导出图片exclude_links: true, // 不导…...
Spring Boot 多租户架构实现:基于上下文自动传递的独立资源隔离方案
一、核心设计思想 通过线程上下文自动传递租户ID,结合动态数据源路由和中间件连接工厂,实现MySQL、Redis、RocketMQ的完全自动化资源隔离。关键设计如下: #mermaid-svg-ZjXCGSWoCuNFMIch {font-family:"trebuchet ms",verdana,aria…...

在 JavaScript 中正确使用 Elasticsearch,第二部分
作者:来自 Elastic Jeffrey Rengifo 回顾生产环境中的最佳实践,并讲解如何在无服务器环境中运行 Elasticsearch Node.js 客户端。 想获得 Elastic 认证?查看下一期 Elasticsearch Engineer 培训的时间! Elasticsearch 拥有大量新…...

更新nvidia-container-toolkit 1.17.7-1后,运行--gpus all 卡死问题
用Arch每日一滚,结果今天用 sudo docker run -it --runtimenvidia --gpus all居然卡死了,排雷排了几小时,才从开源库发现问题 nvidia-container-toolkit 1.17.7-1 是有问题的,而且在ubuntu和arch上都存在问题。 只好Downgrade 1.…...
【Nginx学习笔记】:Fastapi服务部署单机Nginx配置说明
服务部署单机Nginx配置说明 服务.conf配置文件: upstream asr_backend {server 127.0.0.1:8010; }server {listen 80;server_name your_domain.com;location / {proxy_pass http://localhost:8000;proxy_set_header Host $host;proxy_set_header X-Real-IP $remot…...
相机标定与图像处理涉及的核心坐标系
坐标系相互关系 #mermaid-svg-QxaMjIcgWVap0awV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-QxaMjIcgWVap0awV .error-icon{fill:#552222;}#mermaid-svg-QxaMjIcgWVap0awV .error-text{fill:#552222;stroke:#552…...
在 ASP.NET 中,HTTP 处理程序(HttpHandler)是处理 HTTP 请求的核心组件
ASP.NET 中 HttpHandler 的用法详解 在 ASP.NET 中,HTTP 处理程序(HttpHandler)是处理 HTTP 请求的核心组件。根据你的配置文件,我将详细解释 <handlers> 节点的各种用法和配置选项。 1. HttpHandler 概述 HttpHandler 是…...

通义灵码 2.5 版深度评测:智能编程的边界在哪里?
通义灵码 2.5 版深度评测:智能编程的边界在哪里? 评测目标 全面测试智能体模式:是否真正具备自主决策能力?MCP 工具集成体验:能否提升开发效率?AI 记忆自感知能力:是否能真正理解开发者习惯&a…...

电商项目-商品微服务-规格参数管理,分类与品牌管理需求分析
本文章介绍:规格参数管理与分类与品牌管理的需求分析和表结构的设计。 一、规格参数管理 规格参数模板是用于管理规格参数的单元。规格是例如颜色、手机运行内存等信息,参数是例如系统:安卓(Android)后置摄像头像素&…...

零基础设计模式——创建型模式 - 工厂方法模式
第二部分:创建型模式 - 工厂方法模式 (Factory Method Pattern) 上一节我们学习了单例模式,它关注如何保证一个类只有一个实例。现在,我们来看另一个重要的创建型模式——工厂方法模式。它关注的是如何创建对象,但将创建的决定权…...
LeetCode 404.左叶子之和的递归求解:终止条件与递归逻辑的深度剖析
一、题目解析:左叶子的定义与递归求解思路 题目描述 LeetCode 404. 左叶子之和要求计算二叉树中所有左叶子节点的值之和。左叶子的严格定义是:如果一个节点是其父节点的左子节点,并且它本身没有左右子节点,则称为左叶子。 关键…...
蓝桥杯5130 健身
问题描述 小蓝要去健身,他可以在接下来的 1∼n 天中选择一些日子去健身。 他有 m 个健身计划,对于第 i 个健身计划,需要连续的 天,如果成功完成,可以获得健身增益 si ,如果中断,得不到任何…...

电商虚拟户:重构资金管理逻辑,解锁高效归集与智能分账新范式
一、电商虚拟户的底层架构与核心价值 在数字经济浪潮下,电商交易的复杂性与日俱增,传统账户体系已难以满足平台企业对资金管理的精细化需求。电商虚拟户作为基于银行或持牌支付机构账户体系的创新解决方案,通过构建“主账户子账户”的虚拟账户…...

腾讯2025年校招笔试真题手撕(二)
一、题目 最近以比特币为代表的数字货币市场非常动荡,聪明的小明打算用马尔科夫链来建模股市。如图所示,该模型有三种状态:“行情稳定”,“行情大跌”以及“行情大涨”。每一个状态都以一定的概率转化到下一个状态。比如…...
DeepSeek快速搭建个人网页
一、环境准备 注册DeepSeek账号(https://www.deepseek.com/)安装VSCode插件:DeepSeek Coder准备基础开发环境:# 推荐使用Node.js环境 npm install -g live-server二、三步搭建基础框架 步骤1:生成基础模板 在DeepSeek对话框输入: 生成一个响应式个人网页的HTML模板,包…...

安装完dockers后就无法联网了,执行sudo nmcli con up Company-WiFi,一直在加载中
Docker服务状态检查 执行 systemctl status docker 确认服务是否正常 若未运行,使用 sudo systemctl start docker && sudo systemctl enable docker 网络配置冲突 Docker会创建docker0虚拟网桥,可能与宿主机网络冲突 检查路由表 ip route sho…...

【深度学习新浪潮】2025年谷歌I/O开发者大会keynote观察
1. 2025年谷歌I/O开发者大会keynote重点信息 本次Google I/O大会的核心策略是降低AI使用门槛与加速开发者创新,通过端侧模型(Gemini Nano)、云端工具(Vertex AI)和基础设施(TPU)的全链路优化,进一步巩固其在生成式AI领域的领先地位。同时,高价订阅服务和企业级安全功…...
小球弹弹弹
一球从100米高度自由落下,每次落地后反跳回原高度的一半,再落下。求它在第十次落地时,共经过多少米?第十次反弹多高? 从第一次弹起到第二次落地前经过的路程为前一次弹起最高高度的一半乘以2,加上前面经过…...

案例分享——福建洋柄水库大桥智慧桥梁安全监测
项目背景 洋柄水库桥位于社马路(社店至马坪段)上,桥梁全长285m,桥梁中心桩号K15082跨径组合为 14x20m,全桥宽:33.8m,分左右双幅:上部结构采用空心板梁:桥采用柱式墩。 通过对桥梁结构长时间的定期观测,掌握桥梁在混凝…...

鸿蒙操作系统架构:构建全场景智慧生态的分布式操作系统
鸿蒙操作系统(HarmonyOS)是华为推出的面向全场景的分布式操作系统,旨在为智能手机、智能家居、智能穿戴、车机等多种设备提供统一的操作系统平台。鸿蒙架构的核心设计理念是“一次开发,多端部署”,通过分布式技术实现设备间的无缝协同。本文将深入探讨鸿蒙的分层架构、分布…...

NBA足球赛事直播源码体育直播M35模板赛事源码
源码名称:NBA足球赛事直播源码体育直播M35模板赛事源码 开发环境:帝国cms7.5 空间支持:phpmysql 带软件采集,可以挂着自动采集发布,无需人工操作! 演示地址:https://www.52muban.com/shop/184…...

自动化测试报告工具
自动化测试报告工具大全与实战指南 📊🔥 在自动化测试流程中,测试用例的执行只是第一步,而测试报告的生成与可视化则是闭环的重要一环。无论是个人项目还是团队协作,高质量的测试报告都能帮助我们快速定位问题、衡量测…...
Elasticsearch 实战面试题,每个题目都会单独解析
Elasticsearch 在 Java 中最常用的客户端是什么?如何初始化一个 RestHighLevelClient?如何用 Spring Boot 快速集成 Elasticsearch?Spring Data Elasticsearch 如何定义实体类与索引的映射? ES的倒排索引和正排索引的区别及适用场…...

python 中 SchedulerManager 使用踩坑
问题: 服务中我写了多个定时任务,如下: 发现到了定时时间,下面的任务就是不执行,,最后一个任务一个任务注释掉来测,发现了问题, self.scheduler_manager.add_cron_job(SearchQualit…...
Python后端框架新星Robyn:性能与开发体验的双重革命
引言:Python后端框架的进化之路 在Web开发领域,Python生态长期被Flask、Django等经典框架主导。随着异步编程需求的增长和高并发场景的普及,开发者对框架性能提出了更高要求。2023年,一款名为Robyn的新型Web框架横空出世…...

人工智能解析:技术革命下的认知重构
当生成式AI能够自主创作内容、设计方案甚至编写代码时,我们面对的不仅是工具革新,更是一场关于智能本质的认知革命。人工智能解析的核心,在于理解技术如何重塑人类解决问题和创造价值的底层逻辑——这种思维方式的转变,正成为数字…...

【Linux】基础开发工具
文章目录 一、软件包管理器1. Linux下安装软件补充知识1:操作系统的生态补充知识2:我的云服务器是怎么知道去哪找软件包的呢? 2. 查看软件包3. 安装软件4. 卸载软件5. 安装源 二、编辑器Vim1. 命令模式 三、编译器gcc / g1. 程序编译流程补充…...

OpenCV计算机视觉实战(7)——色彩空间详解
OpenCV计算机视觉实战(7)——色彩空间详解 0. 前言1. RGB/BGR 色彩空间2. HSV / Lab 色彩空间3. 颜色直方图分析与可视化小结系列链接 0. 前言 本文深入探讨了三种常见色彩空间:RGB/BGR、HSV 与 CIELAB,并介绍了 OpenCV 中色彩空…...
体育直播网站如何实现实时数据
⚽ 你是否曾好奇: 当你在看足球直播时,进球瞬间比分立刻刷新;篮球比赛中,球员数据实时跳动……这些毫秒级的赛事数据,究竟是如何"飞"到你手机上的? 今天,我们就来扒一扒体育直播网站…...