Бьерн Страуструп. Язык программирования С++ Второе дополненное издание



Pdf көрінісі
бет243/256
Дата11.07.2022
өлшемі2,87 Mb.
#37591
1   ...   239   240   241   242   243   244   245   246   ...   256
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. Существенно, что объект не меняется: это должно гарантировать, что динамическая 
информация о типе отражает статические типы исходной программы. Плохо, если при выполнении 
программы некоторый тип может изменяться. 


Бьерн Страуструп.
Язык программирования С++ 
 
347 
С помощью указателя на объект класса Type_info пользователь получает доступ к информации о типе 
из typeid и, теперь его программа начинает зависеть от конкретной системы динамических запросов о 
типе и от структуры динамической информации о нем. Но эти средства не входят в стандарт языка, а 
задать их с помощью хорошо продуманных макроопределений непросто. 


Достарыңызбен бөлісу:
1   ...   239   240   241   242   243   244   245   246   ...   256




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет