Tôi sử dụng một đối tượng functor để tính toán băm của enum class:
struct EnumClassHash
{
    template <typename T>
    std::size_t operator()(T t) const
    {
        return static_cast<std::size_t>(t);
    }
};
Bây giờ bạn có thể sử dụng nó làm tham số mẫu thứ 3 của std::unordered_map:
enum class MyEnum {};
std::unordered_map<MyEnum, int, EnumClassHash> myMap;
Vì vậy, bạn không cần phải cung cấp một chuyên môn hóa std::hash, suy luận đối số mẫu thực hiện công việc. Hơn nữa, bạn có thể sử dụng từ usingvà tự unordered_mapsử dụng từ này std::hashhoặc EnumClassHashtùy thuộc vào Keyloại:
template <typename Key>
using HashType = typename std::conditional<std::is_enum<Key>::value, EnumClassHash, std::hash<Key>>::type;
template <typename Key, typename T>
using MyUnorderedMap = std::unordered_map<Key, T, HashType<Key>>;
Bây giờ bạn có thể sử dụng MyUnorderedMapvới enum classhoặc một loại khác:
MyUnorderedMap<int, int> myMap2;
MyUnorderedMap<MyEnum, int> myMap3;
Về mặt lý thuyết, HashTypecó thể sử dụng std::underlying_typevà sau đó EnumClassHashsẽ không cần thiết. Đó có thể là một cái gì đó như thế này, nhưng tôi chưa thử :
template <typename Key>
using HashType = typename std::conditional<std::is_enum<Key>::value, std::hash<std::underlying_type<Key>::type>, std::hash<Key>>::type;
Nếu sử dụng std::underlying_typecác công trình, có thể là một đề xuất rất tốt cho tiêu chuẩn.
     
              
std::hashvề loại enum.