2012-01-23 69 views
0

我看到有人建議使用boost ::任何有異類地圖。即C++異構地圖陣列

map<string,boost::any> 

有沒有人有任何運氣存儲(併成功地使用)存儲在地圖上的數組做這種技術?

我已經能夠做到以下幾點:

boost::array<char,100> myArr; 
map<string,boost::any> myMap; 
myArr[51] = a; 
myMap["imageData"] = myArr; 

這樣做的問題是,這似乎是在內存中存儲整個陣列的兩倍。 如果我改變了一下,這樣做:

boost::array<char,100> myArr; 
map<string,boost::any> myMap; 
myArr[51] = a; 
myMap["imageData"] = &myArr; 

我不知道如何找回數據出來的圖。我如何創建一個boost::array<char,100>指針?我可以嗎?是否有其他人能夠做類似的事情或有什麼想法以更優雅的方式做類似的事情?我想在地圖中存儲一個char[100],但是我無法在地圖中放置一次(爲了在地圖中使用數據,必須將其轉換爲適當的類型)。一個解決方案,可以讓我得到一個char[someSize]出地圖將是理想的。

+0

你能解釋一下你的實際目標是什麼? –

+0

@比約恩博動我想創建與運行參數的類。即代替具有一個'INT寬度= 5;'在類定義的,類有一個'映射<串,升壓::任何> classMap'和類的用戶可以做'類映射[「寬度」] = 5 ;'這工作正常,除了我在類映射中存儲char [someSize]值時遇到各種麻煩。例如: '炭myChar [1000];' '類映射[「的imageData」] = myChar;' 存儲炭[1000]在地圖,並使用它是不可能的,因爲你需要轉換數據纔可以使用它。 – imjojo42

回答

0

如果你沒有使用boost ::任何,例如做這樣的事情:

map<string, vector> myMap; 
myMap["imageData"] = vector(100); 

(在我的情況GCC 4.6),編譯器會自動避免額外的副本。出於某種原因,boost :: any阻止了這一點。一個可能的解決辦法是使用shared_ptr

typedef boost::array<char, 100> Image; 
map<string, boost::any> myMap; 
myMap["imageData"] = boost::shared_ptr<Image>(new Image()); 

使用的容器一個shared_ptr往往是使用一個真正的指針你在你的問題建議一個更好的解決方案。當沒有變量指向它時,圖像將被銷燬,從而使程序員不用手動釋放其內存。

根據您的圖像的大小,但是,有兩個副本,直到局部變量的開銷超出範圍可能不會那麼高。所以你也應該考慮保留你當前的解決方案的可能性。