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 функция-элемент) |
(удалено в C++20)(C++20) |
сравнивает базовые объекты 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
[править] Смотрите также
содержит некоторую информацию о типе, сгенерированную реализацией. Это класс, возвращаемый оператором typeid. (класс) |