std::type_index
Материал из cppreference.com
| Определён в заголовочном файле <typeindex>
|
||
| class type_index; |
(начиная с C++11) | |
Класс type_index - это класс-оболочка для объекта типа std::type_info, которая позволяет использовать объекты этого класса в качестве индекса в ассоциативных и в неупорядоченных контейнерах. Отношения с объектом type_info осуществляется с помощью указателя, тем не менее type_index является CopyConstructible и CopyAssignable (т.е объекты этих типов можно скопировать).
Содержание |
[править] Функции-члены класса
| Создание объекта (public функция-член) | |
| (деструктор) (объявлено неявно) |
Уничтожает объект type_index (public функция-член) |
| operator= (объявлено неявно) |
Присвоение объекта type_index (public функция-член) |
| Сравнивает лежащие в основе объекты std::type_info (public функция-член) | |
| Возвращает хэш-код (public функция-член) | |
| Возвращает определённое реализацией имя типа, связанное с лежащим в основе объектом type_info (public функция-член) | |
[править] Вспомогательные классы
| (C++11) |
Поддерживает хеширование для std::type_index (специализация шаблона класса) |
[править] Пример
Следующая программа приводит пример эффективного сопоставления типа-значения.
Запустить этот код
#include <iostream> #include <typeinfo> #include <typeindex> #include <unordered_map> #include <string> #include <memory> 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; // Обратите внимание, что мы храним указатель на тип A std::unique_ptr<A> b(new B); std::unique_ptr<A> c(new C); std::cout << "i является " << type_names[std::type_index(typeid(i))] << '\n'; std::cout << "d является " << type_names[std::type_index(typeid(d))] << '\n'; std::cout << "a является " << type_names[std::type_index(typeid(a))] << '\n'; std::cout << "b является " << type_names[std::type_index(typeid(*b))] << '\n'; std::cout << "c является " << type_names[std::type_index(typeid(*c))] << '\n'; }
Вывод:
i является int d является double a является A b является B c является C
[править] См. также
| Содержит информацию о некотором типе, cгенерированную реализацией. Этот класс возвращается оператором typeid (класс) | |

