1. 程式人生 > >C++製作一個泛型容器(可以盛放各種型別的物件)

C++製作一個泛型容器(可以盛放各種型別的物件)

如果你想要一個可以盛放各種型別的物件,那麼基本上可以說在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);

以上僅僅是拋磚引玉,歡迎各路高手給出更好的方法