0

0

c++怎么使用std::any来存储任意类型的数据_c++类型擦除与动态类型封装方案

尼克

尼克

发布时间:2025-11-23 17:46:02

|

331人浏览过

|

来源于php中文网

原创

std::any是C++17引入的类型安全容器,通过类型擦除技术封装任意可复制类型,支持动态存储和安全提取,适用于配置系统、插件接口等需灵活处理多类型的场景,但存在性能开销且不支持不可复制类型。

c++怎么使用std::any来存储任意类型的数据_c++类型擦除与动态类型封装方案

在C++中,std::any 是 C++17 引入的一个类型安全的容器,可以存储任意类型的单个值。它提供了一种轻量级的“动态类型”机制,允许你在运行时决定存储的数据类型,同时避免了 void* 指针带来的类型不安全问题。这本质上是一种类型擦除(type erasure)技术的应用。

什么是类型擦除?

类型擦除是指将具体类型信息隐藏起来,对外暴露统一的接口。std::any 就是通过类型擦除实现对任意类型的封装。它内部使用虚函数或函数指针来保存类型相关的操作(如拷贝、销毁、访问),从而让外部无需知道实际类型就能安全地操作数据。

如何使用 std::any 存储和读取数据?

使用 std::any 非常直观。你可以用任意可复制的类型构造或赋值一个 any 对象,然后通过 std::any_cast 提取原始类型。

  • 创建 any 对象:直接初始化即可
  • 检查类型:使用 .type() 或 try-catch 配合 any_cast
  • 提取值:使用 std::any_cast(any_obj)
  • 修改内容:重新赋值或使用 emplace

示例代码:

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

#include
#include iostream>
#include

int main() {
    std::any data = 42; // 存储 int
    std::cout (data)
    data = std::string{"Hello"}; // 替换为 string
    std::cout (data)
    // 安全访问:检查是否为某类型
    if (data.type() == typeid(std::string)) {
        std::cout     }

    // 错误访问会抛出异常
    try {
        double d = std::any_cast(data);
    } catch (const std::bad_any_cast&) {
        std::cout     }

    return 0;
}

std::any 的性能与限制

虽然 std::any 使用方便,但也有一些代价和注意事项:

医真AI+开放平台
医真AI+开放平台

医真AI+ 医学AI开放平台

下载
  • 性能开销:内部需要动态分配内存(对于大对象)以及维护类型信息表,调用虚函数等
  • 类型安全依赖手动检查:any_cast 失败会抛异常,需处理或提前判断 type()
  • 不支持不可复制类型:所有存储的类型必须满足可复制构造的要求
  • 无内置比较操作:不能直接比较两个 any 是否相等

如果你需要高性能且类型集合有限,可考虑变体(std::variant)替代。但若类型完全未知或非常广泛,std::any 更灵活。

常见应用场景

std::any 常用于以下场景:

  • 配置系统:键值对中值可能是字符串、数字、布尔等不同类型
  • 插件接口:传递通用参数包
  • 事件系统:携带任意附加数据的通知机制
  • 序列化/反序列化中间层

例如:

std::map<:string std::any> config;
config["timeout"] = 5000;
config["host"] = std::string{"localhost"};
config["verbose"] = true;

基本上就这些。std::any 提供了一个简洁安全的方式来封装任意类型,是现代 C++ 实现动态行为的重要工具之一。正确使用它能显著提升代码灵活性,同时保持类型安全。注意控制使用范围,避免滥用导致调试困难。

相关专题

更多
数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

303

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

222

2025.10.31

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

317

2023.08.02

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

743

2023.08.22

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

524

2023.09.20

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

257

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

208

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1465

2023.10.24

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

27

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 3.7万人学习

Pandas 教程
Pandas 教程

共15课时 | 0.9万人学习

ASP 教程
ASP 教程

共34课时 | 3.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号