C++制作一个泛型容器(可以盛放各种类型的对象)
2014-05-04 16:58
471 查看
如果你想要一个可以盛放各种类型的对象,那么基本上可以说在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++的泛型用不上了,是的,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的执着让我知道字符数组其实可以表示各种类型。
相关文章推荐
- 简单工厂(Factory)-提供一个创建对象实例的功能,而无须关心其具体实现。被创建实例的类型可以是接口、抽象类,也可以是具体的类。
- 在泛型为Integer的ArrayList中存放一个String类型的对象。
- 在泛型为Integer的ArrayList中存放一个String类型的对象
- C++初始化列表问题,类中有一个对象类型的数组成员变量,在初始化列表中初始化时报错“[]”操作符语法错误
- TextBox是一个容器类型的对象
- C++中的private:类型相同的两个对象,是否可以访问对方的private成员?
- JAVA泛型详解(三)---一个创建常用容器对象的泛型工具类
- C++ 转换类型运算符 调用构造函数将变量转化成为一个对象的成员变量
- 写的一个简单的工具类,可以做对象类型的判断和迭代出一个对象所有属性的值
- ArrayList<Integer> list = new ArrayList<Integer>(); 在这个泛型为Integer的ArrayList中存放一个String类型的对象。
- 泛型为Integer的ArrayList中存放一个String类型的对象
- 写一个递归方法,传入一个Map,返回这个Map对象中一共有多个Map类型的对象 Map中是可以添加Map,被添加的这个Map也可以添加Map,所以需要判断传入的Map对象的所有子节点,如果是Map就
- 【ThinkingInC++】46、特定的数据成员可以在一个const对象里被改变
- 【c++】iostreeam中的类为何不可以直接定义一个无参对象呢
- cocos2d-x c++ 制作一个蒙版类型标题框
- C++ STL 如何安全的将一个含有指针变量的类对象放在容器中? 避免浅拷贝问题
- 用c++编写一个不能被继承的类(但是可以在类外部定义该类的对象)
- 一个简单的C++大数类(希望可以得到各种建议)
- java面试要点---ArrayList list = new ArrayList(); 在这个泛型为Integer的ArrayList中存放一个String类型的对象。
- 迭代器-迭代对象-dir(a)可以查看该数据类型有多少种方法。range(10)在py3里就是一个迭代器,for循环实际就是迭代器的应用