Ich benutze ein Funktorobjekt, um den Hash von zu berechnen enum class
:
struct EnumClassHash
{
template <typename T>
std::size_t operator()(T t) const
{
return static_cast<std::size_t>(t);
}
};
Jetzt können Sie es als 3. Template-Parameter von verwenden std::unordered_map
:
enum class MyEnum {};
std::unordered_map<MyEnum, int, EnumClassHash> myMap;
Sie müssen also keine Spezialisierung std::hash
angeben. Der Abzug der Vorlagenargumente erledigt den Job. Darüber hinaus können Sie das Wort verwenden using
und Ihr eigenes erstellen unordered_map
, das std::hash
oder EnumClassHash
je nach Key
Typ Folgendes verwendet:
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>>;
Jetzt können Sie MyUnorderedMap
mit enum class
oder einem anderen Typ verwenden:
MyUnorderedMap<int, int> myMap2;
MyUnorderedMap<MyEnum, int> myMap3;
Theoretisch HashType
könnte man das gebrauchen std::underlying_type
und dann EnumClassHash
wird das nicht nötig sein. Das könnte so etwas sein, aber ich habe es noch nicht versucht :
template <typename Key>
using HashType = typename std::conditional<std::is_enum<Key>::value, std::hash<std::underlying_type<Key>::type>, std::hash<Key>>::type;
Wenn std::underlying_type
Werke verwendet werden, könnte dies ein sehr guter Vorschlag für den Standard sein.
std::hash
den Aufzählungstyp spezialisiert .