我使用一个函数对象来计算enum class
的哈希值:
struct EnumClassHash
{
template <typename T>
std::size_t operator()(T t) const
{
return static_cast<std::size_t>(t);
}
};
现在,您可以将其用作
std::unordered_map
的第三个模板参数:
enum class MyEnum {};
std::unordered_map<MyEnum, int, EnumClassHash> myMap;
因此,您无需提供std::hash
的专业化,模板参数推断会完成这项工作。此外,您可以使用单词using
并创建自己的unordered_map
,该映射使用std::hash
或EnumClassHash
,具体取决于Key
类型:
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>>
现在您可以使用
MyUnorderedMap
与
enum class
或其他类型:
MyUnorderedMap<int, int> myMap2
MyUnorderedMap<MyEnum, int> myMap3
理论上,
HashType
可以使用
std::underlying_type
,那么就不需要使用
EnumClassHash
。代码如下,
但我还没有尝试过:
template <typename Key>
using HashType = typename std::conditional<std::is_enum<Key>::value, std::hash<std::underlying_type<Key>::type>, std::hash<Key>>::type
如果使用std::underlying_type
可行的话,可能会成为标准的一个非常好的建议。
std::hash
。 - Kerrek SB