2013-02-21 26 views
0

我想寫一個使用boost:variant作爲值的通用映射。 我一直在試圖編寫將返回適當類型的get(std :: string key)函數。增強變體:我如何做一個返回設置類型的訪問者?

這裏是我想出迄今:

class GenericHashMap { 
private: 
std::map< std::string, boost::variant<int, bool, double, std::string> > genericMap; 

public: 
    template<typename T> 
    bool getValue(const std::string & key, T & value) { 
    if (_map.find(key) == _map.end()) { 
     return false; 
    } 
    T * valuePtr = boost::get<T>(_map[key]); 
    if (valuePtr == NULL) { 
     return false; 
    } 
    value = *valuePtr; 
    return true; 
    } 
} 

我很好奇,我應該如何處理迭代器?值得讓我自己的嵌套迭代器或只是返回嵌套的std :: map。

編輯

我加入了一流的設計,我希望能實現(即一個通用的HashMap)。我遇到的問題是我想要一種方式讓用戶查詢是否將特定鍵存儲爲特定類型。

+0

訪問者可以返回NULL,如果它是錯誤的類型! – Setheron 2013-02-21 00:29:54

+0

'boost :: get'不是訪問者。 – 2013-02-21 00:42:25

+3

你想做什麼,只是一個'boost :: variant'的地圖還沒有做? – 2013-02-21 00:42:34

回答

1

如果您有這樣的問題,這可能意味着您應該使用訪問者,而不是想從您的變體中獲取價值。這通常是與boost::variant一起去的方式。

如果您考慮一下:您不想爲特定鍵值硬連線特定類型。否則,這意味着你失去了boost::variant的所有權力。這意味着你應該爲每個按鍵設置不同的地圖(因爲你知道它們是靜態的,你不應該把所有的東西放在同一張地圖上)。

boost::variant真的在這裏幫助你動態調度,而不是靜態分支。

注意:在您的例子可以查找您的項目兩次的時候才發現,你應該改爲存儲丟棄它,節省您的第二查詢的find結果。

+0

我很困惑如何編寫我的訪問者這樣的用例。我想訪問者返回我指定的模板的值或NULL?當有人試圖將變體分配給某種類型時,我想確保地圖是使用他們期望的類型進行存儲的? – Setheron 2013-02-21 00:57:25

+1

我在說的是錯誤在於設計:你不應該那麼想。想想你的根本問題,而不是試圖繞過它。您正在混合動態運行時信息和靜態信息:它無法工作。要麼你靜態地有多個地圖,要麼你接受你的變體中的類型是動態的。你不能同時擁有這兩個:這就是C++類型系統強制執行的內容。 – Mic 2013-02-21 01:08:10

相關問題