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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top