27 votes

C++11 - unicité de typeid

En C++11, j'utilise ceci

typeid(T).name()

pour mon propre calcul de hachage. Je n'ai pas besoin que le résultat soit le même entre les exécutions ou les compilations du programme. J'ai juste besoin qu'il soit unique pour les types. Je sais qu'il peut retourner le même nom pour différents types, mais c'est généralement le cas avec les constantes, les pointeurs, etc. Dans mon cas, T est seulement class XY , struct XX ou des types dérivés.

Dans ce cas, puis-je supposer, que T sera unique ?

25voto

StoryTeller Points 6139

Vous devez utiliser std::type_index à des fins de cartographie.

La classe type_index est une classe enveloppante autour d'un objet std::type_info qui peut être utilisé comme index dans des tables associatives et non ordonnées. conteneurs associatifs. La relation avec l'objet type_info est est maintenue par le biais d'un pointeur, donc type_index est CopyConstructible et CopyAssignable.

18voto

TartanLlama Points 1461

std::type_info::name est définie par l'implémentation, vous ne devez donc pas compter sur le fait qu'elle soit unique pour différents types.

Puisque vous faites cela pour le calcul de hachage, vous devriez utiliser std::type_info::hash_code à la place. Bien que cela ne garantie que les valeurs seront uniques, la norme stipule que les implémentations doivent essayer de retourner des valeurs différentes pour des types différents. Tant que votre implémentation de carte de hachage dispose d'une gestion raisonnable des collisions, cela devrait vous suffire.

6voto

Gill Bates Points 3884

Comme indiqué sur Référence cpp :

Renvoie une chaîne de caractères à terminaison nulle définie par la mise en œuvre. contenant le nom du type. Aucune garantie n'est donnée, en particulier particulier, la chaîne retournée peut être identique pour plusieurs types et changer entre les invocations du même programme.

Donc, non, vous ne pouvez pas. Vous ne pouvez rien présumer en fait.

Bien que, hash_code() vous donne :

size_t hash_code() const noexcept;

7 retours : Une valeur non spécifiée, sauf qu'au cours d'une seule exécution du programme du programme, il doit renvoyer la même valeur pour deux objets type_info dont la comparaison est égale.

8 Remarque : une implémentation doit renvoyer des valeurs différentes pour deux objets type_info qui ne sont pas égaux entre eux .

Ce qui signifie que hash_code() peut être utilisé pour distinguer deux types différents seulement si operator== para type_info soutient cela.

3voto

themagicalyang Points 1041

Ce que vous pourriez faire, c'est prendre l'adresse d'un membre.

class HashBase {
    virtual intptr_t get() = 0;
};

template <typename T>
class Hash : HashBase {
    static const int _addr = 0;
    intptr_t get() override { return reinterpret_cast<intptr_t>(&_addr); }
};

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X