Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Cpp_Страуструп.doc
Скачиваний:
16
Добавлен:
03.05.2015
Размер:
3.2 Mб
Скачать

13.5.1 Информация о типе

В С++ нет иного стандартного средства получения динамической информации

о типе, кроме вызовов виртуальных функцийЬ.

Ь Хотя было сделано несколько предложений по расширению С++ в этом

направлении.

Смоделировать такое средство довольно просто и в большинстве

больших библиотек есть возможности динамических запросов о типе.

Здесь предлагается решение, обладающее тем полезным свойством,

что объем информации о типе можно произвольно расширять. Его можно

реализовать с помощью вызовов виртуальных функций, и оно может

входить в расширенные реализации С++.

Достаточно удобный интерфейс с любым средством, поставляющим

информацию о типе, можно задать с помощью следующих операций:

typeid static_type_info(type) // получить typeid для имени типа

typeid ptr_type_info(pointer) // получить typeid для указателя

typeid ref_type_info(reference) // получить typeid для ссылки

pointer ptr_cast(type,pointer) // преобразование указателя

reference ref_cast(type,reference) // преобразование ссылки

Пользователь класса может обойтись этими операциями, а создатель

класса должен предусмотреть в описаниях классов определенные

"приспособления", чтобы согласовать операции с реализацией

библиотеки.

Большинство пользователей, которым вообще нужна динамическая

идентификация типа, может ограничиться операциями приведения

ptr_cast() и ref_cast(). Таким образом пользователь отстраняется от

дальнейших сложностей, связанных с динамической идентификацией

типа. Кроме того, ограниченное использование динамической информации

о типе меньше всего чревато ошибками.

Если недостаточно знать, что операция приведения прошла успешно,

а нужен истинный тип (например, объектно-ориентированный

ввод-вывод), то можно использовать операции динамических запросов о типе:

static_type_info(), ptr_type_info() и ref_type_info(). Эти операции

возвращают объект класса typeid. Как было показано в примере с

set и slist_set, объекты класса typeid можно сравнивать. Для

большинства задач этих сведений о классе typeid достаточно. Но для

задач, которым нужна более полная информация о типе, в классе

typeid есть функция get_type_info():

class typeid {

friend class Type_info;

private:

const Type_info* id;

public:

typeid(const Type_info* p) : id(p) { }

const Type_info* get_type_info() const { return id; }

int operator==(typeid i) const ;

};

Функция get_type_info() возвращает указатель на неменяющийся (const)

объект класса Type_info из typeid. Существенно, что объект

не меняется: это должно гарантировать, что динамическая информация

о типе отражает статические типы исходной программы. Плохо, если

при выполнении программы некоторый тип может изменяться.

С помощью указателя на объект класса Type_info пользователь

получает доступ к информации о типе из typeid и, теперь его

программа начинает зависеть от конкретной системы динамических

запросов о типе и от структуры динамической информации о нем.

Но эти средства не входят в стандарт языка, а задать их с помощью

хорошо продуманных макроопределений непросто.