2013-02-11 131 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