662 Часть IV. Новые возможности C++

Рассмотрим кратко возможности, которые обеспечивает typeinfo. Очевидно, что с помощью перегруженных операций сравнения объекты typeinfo можно сравнивать. Используя метод name, программа может извлечь имя типа в виде символьной строки. Наконец, с помощью метода before программа может определить лексикографический порядок двух типов (на основе имен типов).

Замечание

(Поскольку и конструктор копий, и операция присваивания объявлены как закрытые, объекты класса typeinfo нельзя копировать;

! Предупреждение

Компилятор Borland C++ 5 соответствует ранним проектам стандарта ANSi C++, в которых в некоторые имена типов RTTI входили буквы обоих регистров (а именно: Bad_cast, Bad_typeid и Type_info). В проекте от сентября 1995 г. (последняя версия на момент написания книги) эти имена были изменены на эквиваленты, содержащие только символы нижнего регистра. Таким образом, в отношении Type_info Borland C++ 5 оказался раздвоенным: компилятор C++ будет воспринимать либо Type_info, либо правильный вариант typeinfo. Несовместимость с Borland C++ может возникнуть при передаче в него кода, который был разработан для компиляторов, поддерживающих только новое соглашение об именах. В случае с Symantec C++ 7.2 проблем не возникнет, так как там так же используются старые имена. С другой стороны, Visual C++ 4 может быть наиболее вероятным источником несовместимости, поскольку компилятор Microsoft использует только новые имена.

Как программа создает или получает доступ к экземплярам класса typeinfo? В RTTI имеется операция typeid, разработанная для того, чтобы возвращать объекты типа typeinfo. Она принимает единственный аргумент, который может быть или именем простого типа, или выражением, и возвращает ссылку на typeinfo, которая соответствует переданному типу или выражению.

Операция typeid не ограничивает свои аргументы только полиморфными типами; рассмотрим, например, такой фрагмент:

// Вывести имена нескольких целочисленных типов cout « typeid(int).name() » "\n";

cout « typeid(unsigned long).name() « "\n";

cout « typeid(char).name() <<"\n";

t

Как и следовало ожидать, эти три операции выводят соответственно int,

unsigned long И char*.

Поскольку операция typeid может принимать выражения, в нее можно передавать имена переменных и оперировать с получаемыми ссылками. Следующий КОД ВЫВОДИТ СТрОКу class Apple: