Wie spezialisiere ich std :: hash & lt; Key & gt; :: operator () für einen benutzerdefinierten Typ in ungeordneten Containern?

Unterstützt user-defined key types in std::unordered_set<Key> und std::unordered_map<Key, Value>
man hat operator==(Key, Key) - und ein hash-Funktor:

struct X { int id; /* ... */ };
bool operator==(X a, X b) { return a.id == b.id; }

struct MyHash {
  size_t operator()(const X& x) const { return std::hash<int>()(x.id); }
};

std::unordered_set<X, MyHash> s;

Wäre es bequemer zu schreiben, nur std::unordered_set<X>
mit einem Standard-hash - für Typ X,
wie für die Arten kommen zusammen mit dem compiler und Bibliothek.
Nach Anhörung

scheint es möglich, sich zu spezialisieren std::hash<X>::operator():

namespace std { //argh!
  template <>
  inline size_t 
  hash<X>::operator()(const X& x) const { return hash<int>()(x.id); } //works for MS VC10, but not for g++
  //or
  //hash<X>::operator()(X x) const { return hash<int>()(x.id); }     //works for g++ 4.7, but not for VC10 
}                                                                             

Gegeben compiler-Unterstützung für C++11 ist noch experimentellen---ich habe nicht versucht Clang---, dies sind meine Fragen:

  1. Ist es legal solch eine Spezialisierung namespace std? Ich habe gemischte Gefühle darüber.
  2. Welche der std::hash<X>::operator() Versionen, wenn überhaupt, ist kompatibel mit standard C++11?
  3. Gibt es eine portable Möglichkeit, es zu tun?

InformationsquelleAutor der Frage René Richter | 2011-11-16

Schreibe einen Kommentar