C++11 Hash-Funktion für jede enum-Typ
Schreibe ich eine hash-Funktion für mein Objekt. Ich kann schon hash-Behälter und kombinieren hashes, Dank Generische Hash-Funktion für alle STL-Container. Aber meine Klassen haben auch enums. Natürlich kann ich erstellen Sie eine hash-Funktion für jeden enum, aber es scheint nicht wie eine gute Idee. Ist es möglich, einige Allgemeine Spezifikation für std::hash
, so dass es verwendet werden könnte, um jedes enum? So etwas wie, dass, mit std::enable_if
und std::is_enum
namespace std {
template <class E>
class hash<typename std::enable_if<std::is_enum<E>::value, E>::type> {
public:
size_t operator()( const E& e ) const {
return std::hash<std::underlying_type<E>::type>()( e );
}
};
};
PS. Dieser code wird nicht kompiliert
error: template parameters not used in partial specialization:
error: ‘E’
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre
E
parameter kann nicht abgeleitet werden, denn der compiler kann nicht wissen, dass Ihreenable_if<...>::type
endet bezeichnenE
wieder (und in der Tat gibt es einige Spezialisierungen, dass es vom design nicht!). Es ist als "nicht-abgeleitet Kontext" für dieE
.Wenn
hash
nur einen parameter besitzt, gibt es keine Möglichkeit (von der ich mir bewusst bin) zu SFINAE aus Ihrer teilweisen Spezialisierung.Wenn Sie bereit sind, verwenden Sie Makros, könnten Sie dump die richtige std::hash Spezialisierung neben Ihrer enum-Deklaration.
Ansonsten, der einzige Weg den ich gefunden habe, einfach hash-enum-Werte ist die Verallgemeinerung der hash-Typ:
und mit es so:
Was Sie zu tun versuchen, ist verboten, durch die standard -.
So können Sie sicherlich verfolgen einige der Ideen, die in diesen Antworten, aber Sie können es nicht nennen std::hash. Definieren Sie Ihre eigenen 'enum_hash' Vorlage scheint wie eine gute Idee.