< cpp‎ | types‎ | type info
Utilities library
Language support
Type support (basic types, RTTI)
Library feature-test macros (C++20)
Dynamic memory management
Program utilities
Coroutine support (C++20)
Variadic functions
Debugging support
Three-way comparison
General utilities
Date and time
Function objects
Formatting library (C++20)
Relational operators (deprecated in C++20)
Integer comparison functions
Swap and type operations
Common vocabulary types
Elementary string conversions

std::size_t hash_code() const noexcept;
(since C++11)

Returns an unspecified value (here denoted by hash code) such that for all std::type_info objects referring to the same type, their hash code is the same.

No other guarantees are given: std::type_info objects referring to different types may have the same hash code (although the standard recommends that implementations avoid this as much as possible), and hash code for the same type can change between invocations of the same program.


[edit] Parameters


[edit] Return value

A value that is identical for all std::type_info objects referring to the same type.

[edit] Example

The following program is an example of an efficient type-value mapping without using 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';


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

[edit] See also

(removed in C++20)
checks whether the objects refer to the same type
(public member function) [edit]
implementation defined name of the type
(public member function) [edit]