t1 == t2 | Возвращает значение true , если оба объекта (t1 и t2 ) имеют тот же тип, и значение false — в противном случае |
t1 != t2 | Возвращает значение true , если оба объекта (t1 и t2 ) имеют разные типы, и значение false — в противном случае |
t.name() | Возвращает символьную строку в стиле С, содержащую отображаемую версию имени типа. Имена типов создаются способом, не зависящим от системы |
t1.before(t2) | Возвращает логическое значение (тип bool ), указывающее на то, следует ли тип t1 прежде типа t2 . Порядок следования зависит от компилятора |
У класса type_info
нет стандартного конструктора, а оператор присвоения, конструктор копий и перемещения определены как удаленные (см. раздел 13.1.6). Поэтому нельзя определять, копировать или присваивать объекты типа type_info
. Единственный способ создания объектов класса type_info
— это оператор typeid
.
Функция-член name()
возвращает символьную строку в стиле С, содержащую имя класса объекта. Значение, используемое для данного типа, зависит от компилятора и не обязательно соответствует имени класса, использованному в программе. Единственное, что гарантирует функция name()
, — это уникальность возвращаемой ей строки для данного типа.
Рассмотрим пример:
int arr[10];
Derived d;
Base *p = &d
cout << typeid(42).name() << ", "
<< typeid(arr).name() << ", "
<< typeid(Sales_data).name() << ", "
<< typeid(std::string).name() << ", "
<< typeid(p).name() << " , "
<< typeid(*p).name() << endl;
При запуске на машине авторов эта программа выводит следующее
i, A10_i, 10Sales_data, Ss, P4Base, 7Derived
type_info
зависит от компилятора. Некоторые компиляторы предоставляют и другие функции-члены, которые возвращают дополнительную информацию о типах, используемых в программе. Чтобы выяснить реальные возможности класса type_info
для конкретного компилятора, необходимо обратиться к его документации.
Упражнение 19.9. Напишите программу, подобную приведенной в конце этого раздела, для вывода имен, используемых компилятором для общих типов. Если ваш компилятор создает вывод, подобный нашему, напишите функцию, которая преобразует эти строки в более понятную для человека форму.
Упражнение 19.10. С учетом приведенной ниже иерархии классов, в которой каждый класс обладает открытым стандартным конструктором и виртуальным деструктором, укажите, какие имена типов отобразят следующие операторы?
class A { /* ... */ };
class В : public A { /* ... */ };
class С : public В { /* ... */ };
(a) A *pa = new С;
cout << typeid(pa).name() << endl;
(b) С cobj;
A& ra = cobj;
cout << typeid(&ra).name() << endl;
(c) B *px = new B;
A& ra = *px;
cout << typeid(ra).name() << endl;
19.3. Перечисления
enum class
(или enum struct
), сопровождаемые именем перечисления и разделяемым запятыми списком перечислителей (enumerator), заключенным в фигурные скобки. За закрывающей фигурной скобкой следует точка с запятой:
enum class open_modes {input, output, append};
Здесь определен тип перечисления open_modes
с тремя перечислителями: input
, output
и append
.
В определении class
(или struct
) отсутствует. Имя перечисления с не ограниченной областью видимости не является обязательным: