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.2.4

Упражнение 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;

<p>19.3. Перечисления</p>

Перечисления (enumeration) позволяют группировать наборы целочисленных констант. Как и класс, каждое перечисление определяет новый тип. Перечисления — литеральные типы (см. раздел 7.5.6).

В языке С++ есть два вида перечислений: с ограниченной и с не ограниченной областью видимости. Перечисление с ограниченной областью видимости (scoped enumeration) вводит новый стандарт. Для определения перечисления с ограниченной областью видимости используются ключевые слова enum class (или enum struct), сопровождаемые именем перечисления и разделяемым запятыми списком перечислителей (enumerator), заключенным в фигурные скобки. За закрывающей фигурной скобкой следует точка с запятой:

enum class open_modes {input, output, append};

Здесь определен тип перечисления open_modes с тремя перечислителями: input, output и append.

В определении перечисления с не ограниченной областью видимости (unscoped enumeration) ключевое слово class (или struct) отсутствует. Имя перечисления с не ограниченной областью видимости не является обязательным:

Перейти на страницу:

Похожие книги