2011-11-05 55 views
0

該鍵將是一個字符串,並且該值將是任何類型的向量。是否可以創建一個向量圖,其中向量可以是任何類型的?

例如,第一個鍵可以映射到整數的矢量,第二個鍵可映射到浮點的矢量。在C++中可能嗎?

如果沒有,我可以通過其他方式達到類似的效果嗎?

+2

更迫切的問題是爲什麼你認爲你需要這個。 – delnan

+0

基本上沒有。通過其他手段?絕對。爲什麼? –

+0

它可以完成,但可能不應該。這是純粹的學術,還是你想做點什麼? – Beta

回答

1

任何類型?你可以考慮使用Boost.Any。然後你的類型是:

std::map<std::string, std::vector<boost::any> > 
+0

我認爲向量中的元素需要一致的類型。地圖中每個鍵的不同類型的矢量。 –

2

嗯,你可以這樣做:

std::map<std::string, std::vector<boost::any> > 

但它是非常不可能的,這是你真正想要的東西。你爲什麼認爲你需要這個?

我有一個opengl渲染器,目前用java編寫,但被移植到C++。在這個渲染器中,我試圖隔離可以改變緩衝區和着色器的部分。所以我有一個registerBuffer和registerShader函數。 registerBuffer函數將着色器變量名稱(字符串)映射到緩衝區。但緩衝區可以是GLfloat或GLushort。所以現在我想能夠將着色器變量名映射到GLfloat或GLushort的矢量。

那麼,你可以使用std::map<std::string, boost::variant<GLfloat, GLushort>>然後。

+0

或者'map '...可能效率更高,因爲它存儲的鑑別器更少。 –

+0

@John:可能,但澤維爾特別詢問了一個映射到向量:) – fredoverflow

+0

取決於哪一個更重要 - 值被類型限制爲向量,或者向量一旦找到它就受到類型的約束。 –

1

一個vector<T>的值都必須是同一類型T和一個map<K,V>的值都必須V類型,是vector<T>一些T的,所以,不,不開箱的,但你可以得到周圍的類型爲Boost.Any庫。

2

boost :: any解決方案似乎對我來說是一個黑客攻擊。我建議你看看你的渲染器的面向對象設計。

你需要的是一個具有字符串鍵和緩衝區作爲值的映射,正確嗎?然後編寫一個Buffer類,它可以在內部保存任何類型的OpenGL緩衝區,並使每個實例都跟蹤它所保存的緩衝區的類型。這個類的數據存儲可以是一個通用的void*,然後在需要將緩衝區發送到OpenGL時將其轉換爲正確的類型。

然後,你的數據結構問題尚未完全解決,你可以這樣做:

std::map<std::string, Buffer> 

好運。

相關問題