我使用函子对象来计算的哈希值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
研究枚举类型。