2013-02-11 5 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? 
+1

Как вы используете 'enum', этот [документ] (http://isocpp.org/blog/2013/02/closer-to-perfection) описывает расширения для' enum's, введенные в C++ 11 (просто позаботьтесь о том, чтобы вы не помогли). – hmjd

+0

@hmjd интересно читать, спасибо. – user1873947

+0

Возможный дубликат [Как специализировать std :: hash :: operator() для пользовательского типа в неупорядоченных контейнерах?] (Http://stackoverflow.com/questions/8157937/how-to-specialize-stdhashkeyoperator-for -user-defined-type-in-unordered) – Orient

ответ

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