std::type_index
Определён в заголовке <typeindex> | ||
|---|---|---|
class type_index; | (начиная с C++11) |
Класс type_index — это класс-обёртка для объекта std::type_info, который можно использовать в качестве индекса в ассоциативных и неупорядоченных ассоциативных контейнерах. Связь с объектом type_info поддерживается с помощью указателя, поэтому type_index удовлетворяет требованиям CopyConstructible и CopyAssignable.
Функции-члены
| создаёт объект (открытая функция-член) |
|
|
(деструктор)
(объявлен неявно) | уничтожает объект type_index (открытая функция-член) |
|
operator=
(объявлен неявно) | присваивает объект type_index (открытая функция-член) |
|
(удалён в C++20)(C++20) | сравнивает базовые объекты std::type_index (открытая функция-член) |
| возвращает хеш-код (открытая функция-член) |
|
| возвращает определяемое реализацией имя типа, связанного с базовым объектом type_info (открытая функция-член) |
Вспомогательные классы
|
(C++11) | поддержка хеширования для std::type_index (специализация шаблона класса) |
Пример
Следующая программа демонстрирует эффективное сопоставление типов и значений.
#include <iostream>
#include <memory>
#include <string>
#include <typeindex>
#include <typeinfo>
#include <unordered_map>
struct A
{
virtual ~A() {}
};
struct B : A {};
struct C : A {};
int main()
{
std::unordered_map<std::type_index, std::string> type_names;
type_names[std::type_index(typeid(int))] = "int";
type_names[std::type_index(typeid(double))] = "double";
type_names[std::type_index(typeid(A))] = "A";
type_names[std::type_index(typeid(B))] = "B";
type_names[std::type_index(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[std::type_index(typeid(i))] << '\n';
std::cout << "d is " << type_names[std::type_index(typeid(d))] << '\n';
std::cout << "a is " << type_names[std::type_index(typeid(a))] << '\n';
std::cout << "*b is " << type_names[std::type_index(typeid(*b))] << '\n';
std::cout << "*c is " << type_names[std::type_index(typeid(*c))] << '\n';
}
Вывод:
i is int d is double a is A *b is B *c is C
См. также
| содержит информацию о типе; класс, возвращаемый оператором typeid (класс) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/types/type_index