Comment étendre std::tr1::hash pour les types personnalisés?

Comment puis-je permettre à la STL de mise en œuvre de ramasser mon type personnalisé? Sur MSVC, il existe une classe std::tr1::hash, qui je peut partiellement se spécialisent en utilisant

namespace std 
{
    namespace tr1 
    { 
        template <> 
        struct hash<MyType> 
        { ... };
    } 
}

mais est-ce recommandé? Par ailleurs, est-ce de travailler avec GCC de mise en œuvre ainsi? Pour boost::hash, c'est suffisant pour fournir une fonction libre size_t hash_value (const MyType&), est-il quelque chose de similaire pour le TR1 mise en œuvre?

  • Est-il un moyen d'étendre std::hash pour les types définis par l'utilisateur avec la copie privée, les constructeurs? Aussi, est-il possible de l'étendre avec un opérateur() qui prend un const ref au lieu de val?
  • Quel est le problème avec le modèle de la spécialisation? Vous ne prenez pas une copie de votre objet (vous passez par les références), donc pas de problème -- et l'opérateur() prend un const ref ou de la valeur, tout ce que vous voulez. Regarder Phil Nash réponse, qui prend l'objet en tant que const réf.
InformationsquelleAutor Anteru | 2009-03-15