Est-ce que C ++ 11 fournissent des fonctions de hachage pour std :: type_info?
-
30-09-2019 - |
Question
Je travaille toujours sur une bonne solution à mon One-Of-a-type de conteneur problème - et après réflexion, je pense que ce serait bien de pouvoir simplement utiliser quelque chose comme un std::map<std::type_info, boost::any>
. Malheureusement, std::type_info
ne définit pas operator<
, et je pense qu'il serait déraisonnable pour définir un.
Cependant, il semble raisonnable de définir une fonction de hachage pour cela, parce que vous pouvez simplement utiliser l'adresse singleton de l'objet std::type_info
comme un « hachage » raisonnable. Par conséquent, vous seriez en mesure de mettre un std::type_info
en std::unordered_map
comme la clé.
Est-ce que C ++ 11 fournissent une telle fonction de hachage? Would en utilisant l'adresse mémoire du std::type_info
singleton être une mauvaise stratégie de hachage?
La solution
Le fait que type_info
n'est pas moins que comparable n'est pas autant un problème pour l'utiliser comme clé de carte comme le fait que type_info
est non copiable. : -)
En C ++ 03, type_info
a une fonction de membre de before()
qui fournit une commande d'objets type_info
.
C ++ 11, type_info
a une fonction de membre de hash_code()
(C ++ 11 §18.7.1 / 7):
size_t hash_code() const throw();
retour: une valeur fi ée non spécifiée, à l'exception que dans une seule exécution du programme, il renvoie la même valeur pour les deux objets
.type_info
qui comparent l'égalitéRemarque:. une mise en œuvre doit renvoyer des valeurs différentes pour deux objets
type_info
qui ne comparent égale
objets type_info
issu de la exist opérateur typeid
jusqu'à la fin du programme, il est donc sûr d'utiliser un type_info*
comme clé de la carte. Cependant, au meilleur de ma connaissance, il n'y a aucune garantie que si vous appliquez typeid
à deux objets du même type, vous obtiendrez deux références au même objet type_info
.
Si vous utilisez type_info*
comme une clé de carte, j'utiliser un comparateur personnalisé qui déréférence les pointeurs et compare les type_info
objets eux-mêmes (en utilisant le before()
mentionné ci-dessus ou hash_code()
pour la commande).
Autres conseils
Vous pouvez également utiliser type_index , il détient en toute sécurité un pointeur sur un type_info, il est copiable, comparable et une fonction de hachage est prévu pour les conteneurs standard.