2016-12-18 42 views
0

讓我先說我不能使用boost,因爲這應該是練習。或者是一種懲罰。現在還不確定。序列化任意類型的STL容器(包括其他容器)C++

我必須寫一個函數,它看起來是這樣的:

template <class T1, class T2> 
void serialize<T1, T2>(std::map<T1, T2> in, std::vector<uint8_t>* buf); 

我會遍歷然後在地圖上,每一個序列化對每個條目元素。但是,我遇到了一個問題。

現在我有的問題是,T1可能是,比如說,一個std ::向量填充其他std ::向量的。我還有一個功能類似於上述情況,並假定正常工作,就像這樣:

template <class T1> 
void serialize<T1>(std::vector<T1> in, std::vector<uint8_t>* buf); 

這將有相同的問題,如上面的功能。我是否應該放棄這個並採用不同的方法?或者這仍然可行?我只是想念一些東西?

+0

您是否考慮過反序列化?鑑於輸入緩衝區,你怎麼知道那裏的序列化? –

+0

這真的既不在這裏,也不在那裏,但我想在緩衝區裏有一個標誌,在那裏讀取開始......類似於1,2,3,4等。 – AlterionX

+1

它是* here *。序列化很簡單:編譯器知道你要序列化的類型,不需要RTTI(除非你決定「隱藏」它們並序列化一個虛擬基類)。然而,你計劃投放的那些旗幟?......那些是RTTI性質的!因爲它們是** Runtime **類型信息,所以模板不會像你想象的那樣幫助你。在做出決定之前,認真考慮雙方的具體需求。 –

回答

0

如果您必須知道該元素是否爲矢量或矢量等,則使用模板不是正確的解決方案。

你應該只讓具有工會的對象:

bool isVector; 
union 
{ 
    vector<T> v; 
    T t; 
} 

製作地圖的主要有這樣一個對象。或者如果有更多的可能性使用枚舉。

模板在編譯時應該具有與它已知的任何類型相同的行爲。在你的情況下,只有在運行時才知道對象的類型。