2013-02-11 3 views
1

그래서 내가 사용하는 라이브러리에는 열거 형이 있습니다 (이름이 LibEnum). std::unordered_setLibEnum 일 필요가 있지만 컴파일 오류가 발생하여 전문화되지 않았습니다. std::hash 나는 그것을 쉽게 작성하고 값의 수 (첫 번째 요소는 0, 두 번째 1 등)를 반환 할 수 있지만이 전문화를 정확히 어디에 넣어야하며 어떻게 보일 것인가? 라이브러리 소스를 수정할 수 없습니다.다른 라이브러리의 유형에 대해 std :: hash를 특수화하는 방법

enum LibEnum { A, B, C, D}; 
    std::unordered_set <LibEnum> mySet; 
    //need std::hash for LibEnum 
    //how should it look like? 
당신은 당신의 유형 std::hash을 전문으로 할 수
+1

당신이'enum '을 사용함에 따라이 [document] (http://isocpp.org/blog/2013/02/closer-to-perfection)은 C++ 11에서 소개 된'enum'에 대한 확장을 설명합니다 그냥 당신이 알 수없는 경우). – hmjd

+0

@hmjd 재미있는 읽기, 감사합니다. – user1873947

+0

[정렬되지 않은 컨테이너의 사용자 정의 형식에 대해 std :: hash :: operator()를 특수화하는 방법?] (http://stackoverflow.com/questions/8157937/how-to-specialize-stdhashkeyoperator-for -user-defined-in-unordered) – Orient

답변

8

: std::unordered_map<FooEnum>를 인스턴스화 할 때 또는

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

, 당신은 당신이 좋아 적 hash 유형을 정의하고 그냥 추가 템플릿 인수로 제공 할 수

// 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