std::type_index
Материал из cppreference.com
<tbody>
</tbody>
| Определено в заголовочном файле <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. (класс) |