C++中的容器可以同时保存各种数据类型

[原]C++制作一个泛型容器(可以盛放各种类型的对象)

2014-5-4阅读494 评论0

如果你想要一个可以盛放各种类型的对象,那么基本上可以说在C++里没有,或者你可以用vector<boost::any>或者其他的什么来模拟,我说那都不怎么好。问题就在于我的类型会在运行时动态的增加,你不可能知道我会增加什么类型,我的头文件也不会给你。

现在是不是觉得C++的泛型用不上了,是的,C++的泛型本质上是对相似代码的复用,做的事情都是同一件事情,但仅仅是处理类型的差别。这种情况用的还是比较少的,比如vector,queue,map等这些容器是用泛型的最好的地方了。但你想过没有,这些类型盛放的对象总是那么一种,就是vector<T> ,queue<T>,我现在要一种类型可以盛放各种对象,TA,TB,。。。。。怎么办呢

想来想去我想到了C语言的强制类型装换 TA ta  ;(TB)ta;,这个看起来一般的东东,其实威力无比,他就是C++中的 reinterpret_cast的原型,其功能就是对任意一个内存地址的内容进行重新解释。也就是说,不管你这块内存是什么,我把它强制解释为啥就是啥类型的对象了。

这样以来,其实我只需要一个string就可以保存任何类型的对象了,不是吗?

那么vector<string>也就是这种泛型的容器了。那类型放在哪里存放呢?记住朱总说的:规约大于配置,你可以把int类型用(char)1标记、把TA类型用(char)2标记,如此等等,你可以自定义你打算放入容器中的类型的id编号,取的时候只要先判断这个编号就知道里面盛放的是啥类型的对象了。是不是很嗨皮,我不知道有些人是不是不屑,或者说C++已经有了完美的解决方案而我还不知道而已,欢迎批评指正。

你应该这样将对象放到容器中:

string string_record(1,1);
string_record.append(string((char*)&data1,(char*)&data1 + sizeof(e_eledata)));

你会这么取出你的对象并使用:

cout<<"type : "<<(int)data_array1[i][0]<<endl;
cout<<"message : "<<*(e_eledata*)(data_array1[i].c_str()+1)<<endl;
string s ;
get_decode((int)data_array1[i][0])->decode(data_array1[i].substr(1,data_array1[i].size()-1),s);

以上仅仅是抛砖引玉,欢迎各路高手给出更好的方法

本文的思路来源:感谢同事邱陵给出使用更少或者统一成string类型来表示泛型;感谢陈梵的流处理平台提供了string作为盛放消息数据的数据类型而完成了各种数据的上传和下载;感谢朱总的“规约大于配置”;感谢陈林空工程师给出的整体思路;感谢朱永进对C的执着让我知道字符数组其实可以表示各种类型

时间: 2024-10-29 05:27:42

C++中的容器可以同时保存各种数据类型的相关文章

java中的容器解释

解释一:容器(Container)Spring 提供容器功能,容器可以管理对象的生命周期.对象与对象之间的依赖关系,您可以使用一个配置文件(通常是XML),在上面定义好对象的名称.如何产生(Prototype 方式或Singleton 方式).哪个对象产生之后必须设定成为某个对象的属性等,在启动容器之后,所有的对象都可以直接取用,不用编写任何一行程序代码来产生对象,或是建立对象与对象之间的依赖关系.换个更直白点的说明方式:容器是一个Java 所编写的程序,原先必须自行编写程序以管理对象关系,现在

数据卷中的容器操作,整体来说还是非常简单的

关注公众号,大家可以在公众号后台回复"博客园",免费获得作者 Java 知识体系/面试必看资料. 本文是本系列的第六篇,阅读前面的文章有助于更好的理解本文: Docker 入门及安装[Docker 系列-1] Docker 容器基本操作[Docker 系列-2] Docker 容器高级操作[Docker 系列-3] Docker 镜像基本操作[Docker 系列-4] DockerHub 与容器网络[Docker 系列-5] 数据卷入门 在前面的案例中,如果我们需要将数据从宿主机拷贝到

《深入实践C++模板编程》之六——标准库中的容器

1.容器的基本要求 a.并非所有的数据都可以放进容器当中.各种容器模板对所存数据类型都有一个基本要求——可复制构造.将数据放进容器的过程就是通过数据的复制构造函数在容器内创建数据的一个副本的过程. b.容器中必须有若干与所存数据类型有关的嵌套定义类型. C::value_type 容器所存数据类型 C::reference 容器数据的引用类型 C::const_reference 容器数据的只读引用类型 C::size_type 容器容量类型,通常是一个无符号整数类型 c.除嵌套类型定义外,容器

Java中的容器(集合)之HashMap源码解析

1.HashMap源码解析(JDK8) 基础原理: 对比上一篇<Java中的容器(集合)之ArrayList源码解析>而言,本篇只解析HashMap常用的核心方法的源码. HashMap是一个以键值对存储的容器. hashMap底层实现为数组+链表+红黑树(链表超过8时转为红黑树,JDK7为数组+链表). HashMap会根据key的hashCode得到对应的hash值,再去数组中找寻对应的数组位置(下标). hash方法如下: static final int hash(Object key

【转】C++中map容器的说明和使用技巧

C++中map容器提供一个键值对容器,map与multimap差别仅仅在于multiple允许一个键对应多个值. 一.map的说明    1   头文件   #include   <map>     2   定义   map<string,   int>   my_Map;   或者是typedef     map<string,   int>   MY_MAP;   MY_MAP   my_Map;     3   插入数据   (1)   my_Map["

初识Java中的容器

记得第一次听到java中的容器是一个师哥说的,当时听着十分神秘.那么今天就来揭开那层神秘的面纱. 首先什么是容器呢? 在书写程序的时候,我们常常需要对大量的对象引用进行管理.为了实现有效的归类管理,我们常常将同类的引用放置在同一数据容器中.由于数据容器中存放了我们随时可能需要使用到的对象引用,所以一般的数据容器要都要能能提供方便的查询.遍历.修改等基本接口功能. 早期的OOP语言都通过数组的方式来实现对引用集的集中管理和维护. 但是数组方式下,数组大小需要提前被确定,并不允许修改大小,导致其作为

理解Docker(6):若干企业生产环境中的容器网络方案

本系列文章将介绍 Docker的相关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 (4)Docker 容器的隔离性 - 使用 cgroups 限制容器使用的资源 (5)Docker 网络 (6)若干企业生产环境中的容器网络方案 Docker 在早期只有单机上的网络解决方案,在 1.19 版本引入了原生的 overlay 网络解决方案,但是它的性能损耗较大,可能无法适应一些生产环

如何迅速将磁盘中文件目录树结构做成文本保存

如何迅速将磁盘中文件目录树结构做成文本保存 相像一个这样的场景,你自己在磁盘中下载了大量的视频.音乐和书籍,觉得不错要推荐给朋友,直接把资源传输给他/她可能不太方便,这个时候只需要把文件名放在文本中发送即可.下面我们就学习一下如何做到这一点. 首先我们打开命令行.(Win+R,输入cmd,Enter即可). 我们以E盘为例,将E盘KLive文件夹内文件名记录在文本中.切换到E盘路径. 进入KLive目录路径,输入命令查看内部目录. 现在将内容结构复制到文本中. 我们查看E盘变化. 打开conte

在libvirt 中体验容器

libvirt是一个通用的虚拟化框架,支持xen,kvm,lxc多种虚拟化技术,本文作为一个笔记. 设置LXC为默认(默认为qemu) export LIBVIRT_DEFAULT_URI=lxc:/// virsh -c lxc:/// 可省略 网络设置 NAT NAT是libvirt默认自带,叫做default,通过下面的 命令查看 virsh net-list 假设宿主机有两个网卡,eth0为内网,eth1为外网,我们可以为容器桥接出两个接口: #cat lan.xml <network>