Таким образом, у библиотеки, которую я использую, есть enum (скажем, она называется LibEnum
). Мне нужно иметь std::unordered_set
из LibEnum
, но я получаю ошибку компиляции, что нет специализированного std::hash
для этого. Я мог бы легко написать это и просто вернуть номер значения (первый элемент 0, второй 1 и т. Д.), Но где именно я должен поставить эту специализацию и как она должна выглядеть? Я не могу изменить исходники библиотеки.
enum LibEnum { A, B, C, D};
std::unordered_set <LibEnum> mySet;
//need std::hash for LibEnum
//how should it look like?
Вы можете просто специализироваться 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;
Ни один из методов не требует от вас изменения библиотеки.
Других решений пока нет …