2013-02-11 66 views
1

所以我使用的庫有一個枚舉(說它的名字爲LibEnum)。我需要std::unordered_setLibEnum,但是我收到編譯錯誤,沒有專門的std::hash它。我可以很容易地編寫它,只是返回值的數量(第一個元素是0,第二個1等),但我應該把這個專業化的地方,它應該是什麼樣子?我無法修改庫源。如何專門從其他庫的類型std ::哈希

enum LibEnum { A, B, C, D}; 
    std::unordered_set <LibEnum> mySet; 
    //need std::hash for LibEnum 
    //how should it look like? 
+1

當你使用'enum'這個[document](http://isocpp.org/blog/2013/02/closer-to-perfection)描述了在C++ 11中引入的enum的擴展(只是因爲你不知道)。 – hmjd 2013-02-11 14:33:55

+0

@hmjd有趣的閱讀,謝謝。 – user1873947 2013-02-11 14:34:58

+0

可能重複[如何專門化std :: hash ::運算符()用於無序容器中的用戶定義類型?](http://stackoverflow.com/questions/8157937/how-to-specialize-stdhashkeyoperator-for -user-defined-type-in​​-unordered) – Orient 2016-02-12 06:19:58

回答

8

您可以只專注std::hash你的類型:

namespace std { 
    template <> 
    struct hash<FullyQualified::LibEnum> { 
     size_t operator()(FullyQualified::LibEnum value) const { 
      return static_cast<size_t>(value); 
     } 
    }; 
} 

或者,你可以定義一個hash類型在任何你喜歡的,只是將它作爲額外的模板參數實例std::unordered_map<FooEnum>時:

// Anywhere in your code prior to usage: 

struct myhash { 
    std::size_t operator()(LibEnum value) const { 
     return static_cast<std::size_t>(value); 
    } 
}; 

// Usage: 

std::unordered_map<LibEnum, T, myhash> some_hash; 

這兩種方法都不需要您修改庫。

+0

謝謝,問題解決了。 – user1873947 2013-02-11 14:28:09