2011-11-15 109 views
2

我有一個映射,其中字符串表示屬性名稱,第二個值表示該屬性應具有的類型。屬性的C++映射類型

map.insert(make_pair("X", iDatatype::iUint)); 
map.insert(make_pair("Y", iDatatype::iUint)); 
map.insert(make_pair("RADIANT", iDatatype::iFloat)); 

其中iDatatype只是枚舉所有可能的類型。

typedef enum 
{ 
    iUnknown = 0, 
    iByte = 1, 
    iChar  = 2, 
    iUChar  = 3, 
    iShort  = 4..... 

} iDatatype; 

如果程序得到命令創建,例如,「喜洋洋」比它看地圖,找到iDatatype值(iter->第二)和去切換情況。

switch (iter->second) { 
      case iDatatype::iUint: 
      uint value = ...... 
      // You gotta do what you gonna do 
      break; 
       } ....... 

在Switch情況下,將調用取決於屬性類型的函數。

此代碼有效。但我不確定,如果它是用字符串映射字符串的最佳解決方案。 而我不知道該找什麼的問題?你能推薦什麼方法或技術常用於這種目的?萬分感謝。

回答

3

除非你需要在地圖的其他一些參考,另一種方法是:

if(command == "X" || command == "Y") // make sure command is std::string 
            // or use strcmp 
{ 
    // create uint 
} 
else if(command == "RADIANT") 
{ 
    // create float 
} 

但是我不知道快了多少,這將是比使用地圖,因爲地圖使用二進制搜索而這使用迭代搜索。
如果你想獲得二進制搜索的提升,而無需再枚舉您可以使用地圖功能:

std::map<std::string, std::function<void()> map; 
map.insert(make_pair("X", &create_uint)); 
map.insert(make_pair("Y", &create_uint)); 
map.insert(make_pair("RADIANT", &create_float)); 

,後來把它想:

std::string key = "X"; 
map[key](); 

你也可以通過參數,它想:

void create_uint(std::string param) { /* ... */ } 

std::map<std::string, std::function<void(std::string)> map; 
map.insert(make_pair("X", &create_uint)); 

std::string key = "X"; 
std::string param = "XYZ"; 
map[key](param); 
+0

而連連:我知道這是因爲官方有一段時間了,但是由於C++ 11及其實施的編譯器,對C +小詞,而年輕的年齡+ 11ness o f'std :: function'會比較合適。不是每個人都意識到你需要最新的gcc/VS /任何東西來使用它。當然,我並不是說「不使用C++ 11功能」,而是「提及它們」。 –

+0

@ChristianRau:只是它的新功能並不意味着你需要在岩石下爬行,儘可能地使用C++ 1234BC的功能,並且總是警告新功能。 – Dani

+0

不,使用它,這是一個好主意。但是不要指望新手(雖然這不需要支持OP)知道C++標準化過程,或者他的下一個問題是「爲什麼我的編譯器不能找到'std :: function'?」。 –