Namespaces
Variants
Views
Actions

std::type_info::hash_code

From cppreference.com
< cpp‎ | types‎ | type info
Revision as of 08:11, 27 April 2013 by Eendy (Talk | contribs)

 
 
Utilities library
General utilities
Relational operators (deprecated in C++20)
 
 
 
size_t hash_code() const;
(since C++11)

Returns an unspecified value, which is identical for objects, referring to the same type. No other guarantees are given. For example, the same value may be returned for different types. The value can also change between invocations of the same program.

Contents

Parameters

(none)

Return value

Some value, which is identical for the same types.

Example

The following program is an example of an efficient type-value mapping without using std::type_index.

#include <iostream>
#include <typeinfo>
#include <unordered_map>
#include <string>
#include <functional>
#include <memory>
 
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';
}

Output:

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

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]