Namespaces
Variants

std::type_info::hash_code

De fr.cppreference.net
 
 
Bibliothèque d'utilitaires
Support linguistique
Support des types (types de base, RTTI)
Macros de test de fonctionnalités de la bibliothèque (C++20)
Utilitaires de programme
Fonctions variadiques
Support des coroutines (C++20)
Support des contrats (C++26)
Comparaison à trois voies
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Utilitaires généraux
Opérateurs relationnels (obsolète en C++20)
 
 
 
std::size_t hash_code() const noexcept;
(depuis C++11)

Retourne une valeur non spécifiée (désignée ici par code de hachage) telle que pour tous les objets std::type_info faisant référence au même type, leur code de hachage soit identique.

Aucune autre garantie n'est fournie : des objets std::type_info faisant référence à des types différents peuvent avoir le même code de hachage (bien que la norme recommande aux implémentations d'éviter cela autant que possible), et le code de hachage pour un même type peut changer entre différentes exécutions du même programme.

Paramètres

(aucun)

Valeur de retour

Une valeur identique pour tous les std::type_info objets faisant référence au même type.

Exemple

Le programme suivant est un exemple de mappage efficace type-valeur sans utiliser std::type_index .

#include <functional>
#include <iostream>
#include <memory>
#include <string>
#include <typeinfo>
#include <unordered_map>
struct A
{
    virtual ~A() {}
};
struct B : A {};
struct C : A {};
using TypeInfoRef = std::reference_wrapper<const std::type_info>;
struct Hasher
{
    std::size_t operator()(TypeInfoRef code) const
    {
        return code.get().hash_code();
    }
};
struct EqualTo
{
    bool operator()(TypeInfoRef lhs, TypeInfoRef rhs) const
    {
        return lhs.get() == rhs.get();
    }
};
int main()
{
    std::unordered_map<TypeInfoRef, std::string, Hasher, EqualTo> type_names;
    type_names[typeid(int)] = "int";
    type_names[typeid(double)] = "double";
    type_names[typeid(A)] = "A";
    type_names[typeid(B)] = "B";
    type_names[typeid(C)] = "C";
    int i;
    double d;
    A a;
    // note that we're storing pointer to type A
    std::unique_ptr<A> b(new B);
    std::unique_ptr<A> c(new C);
    std::cout << "i is " << type_names[typeid(i)] << '\n';
    std::cout << "d is " << type_names[typeid(d)] << '\n';
    std::cout << "a is " << type_names[typeid(a)] << '\n';
    std::cout << "*b is " << type_names[typeid(*b)] << '\n';
    std::cout << "*c is " << type_names[typeid(*c)] << '\n';
}

Sortie :

i is int
d is double
a is A
*b is B
*c is C

Voir aussi

(removed in C++20)
vérifie si les objets font référence au même type
(fonction membre publique)
nom défini par l'implémentation du type
(fonction membre publique)