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_info (публичная функция-член) |
| возвращает хэшированное значение (публичная функция-член) |
|
возвращает определённое реализацией имя типа, связанное с базовым объектом 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/w/cpp/types/type_index