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的執着讓我知道字符數組其實可以表示各種類型


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM