代码改变世界

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

2015-08-31 11:16  Erdos001  阅读(7548)  评论(0编辑  收藏  举报

[原]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的执着让我知道字符数组其实可以表示各种类型