# std::type_info::hash_code

< cpp‎ | types‎ | type info

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

返回未指定值，使得指代同一类型的所有 `type_info` 对象的 hash_code() 相同。

不给出其他保证：指代不同类型的 `type_info` 对象可以拥有相同的 hash_code （尽管标准推荐实现尽可能避免这点），而同一类型的 hash_code 可在相同程序的各次不同调用间改变。

### 参数

（无）

### 返回值

对所有指代同一类型的 `type_info` 对象等同的值。

### 示例

下列程序是一个有效的不使用 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;

        // 注意我们存储指向 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

### 参阅

operator==operator!= (C++20 中移除) | 检查对象是否指代相同类型 (公开成员函数)
name | 类型的实现定义名称 (公开成员函数)