C++制作一个泛型容器(可以盛放各种类型的对象)
来源:互联网 发布:东北人假义气 知乎 编辑:程序博客网 时间:2024/06/05 11:39
如果你想要一个可以盛放各种类型的对象,那么基本上可以说在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的执着让我知道字符数组其实可以表示各种类型。
- C++制作一个泛型容器(可以盛放各种类型的对象)
- TextBox是一个容器类型的对象
- Objective-C id为什么可以存放任意类型的对象?
- Python----一个对象的属性可以是另外一个类型创建的对象
- 各种类型的最大最小值(C++)
- JAVA泛型详解(三)---一个创建常用容器对象的泛型工具类
- [面试题]可以盛放多少水呢?
- C语言实现一个泛型容器
- 第11章持有对象 _11.1泛型和类型安全的容器
- 一个可以下载各种模型的网站
- 存放混合类型对象的JAVA容器
- Object-C中使用NSKeyedArchiver归档(将各种类型的对象存储到文件中)
- Object-C中使用NSKeyedArchiver归档(将各种类型的对象存储到文件中)
- 一个可以在线制作邮票的网站
- 制作一个可以滑动操作的 TableViewCell
- UE4制作一个可以控制的小球
- C++_STL 各种容器
- JAVA泛型容器的类型检查
- UML类图
- filename.gz的解压和压缩
- System.exit(0)和System.exit(1)区别
- debian jessie 安装 arm-none-eabi-gcc
- C#窗体信息交互
- C++制作一个泛型容器(可以盛放各种类型的对象)
- oracle创建表空间
- request.getAttribute与request.getParameter的区别
- 青春时代——是路过还是错过
- 在Android系统上运行C/C++程序
- 电脑突发故障应急处理方法
- php基本篇之——mysql
- linux下cfi_cmdset_0002中关于timeout探究
- java二维码生成与解析代码实现