Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КРАТКИЙ ОБЗОР С.doc
Скачиваний:
1
Добавлен:
26.10.2018
Размер:
2.11 Mб
Скачать

13.5.3 Как создать систему динамических запросов о типе

Здесь показано, как можно прямо реализовать динамические запросы о типе, когда в трансляторе таких возможностей нет. Это достаточно утомительная задача и можно пропустить этот раздел, так как в нем есть только детали конкретного решения.       Классы set и slist_set из $$13.3 следует изменить так, чтобы с ними могли работать операции запросов о типе. Прежде всего, в базовый класс set нужно ввести функции-члены, которые используют операции запросов о типе:       class set {       public:       static const Type_info info_obj;       virtual typeid get_info() const;       static typeid info();       // ...       }; При выполнении программы единственным представителем объекта типа set является set::info_obj, который определяется так:       const Type_info set::info_obj("set",0); С учетом этого определения функции тривиальны:       typeid set::get_info() const { return &info_obj; }       typeid set::info() { return &info_obj; }       typeid slist_set::get_info() const { return &info_obj; }       typeid slist_set::info() { return &info_obj; } Виртуальная функция get_info() будет предоставлять операции ref_type_info() и ptr_type_info(), а статическая функция info() - операцию static_type_info().       При таком построении системы запросов о типе основная трудность на практике состоит в том, чтобы для каждого класса объект типа Type_info и две функции, возвращающие указатель на этот объект, определялись только один раз.       Нужно несколько изменить класс slist_set:       class slist_set : public set, private slist {       // ...       public:       static const Type_info info_obj;       virtual typeid get_info() const;       static typeid info();       // ...       };       static const Type_info* slist_set_b[]       = { &set::info_obj, &slist::info_obj, 0 };       const Type_info slist_set::info_obj("slist_set",slist_set_b);       typeid slist_set::get_info() const { return &info_obj; }       typeid slist_set::info() { return &info_obj; }

13.5.4 Расширенная динамическая информация о типе

В классе Type_info содержится только минимум информации, необходимой для идентификации типа и безопасных операций приведения. Но поскольку в самом классе Type_info есть функции-члены info() и get_info(), можно построить производные от него классы, чтобы в динамике определять, какие объекты Type_info возвращают эти функции. Таким образом, не меняя класса Type_info, пользователь может получать больше информации о типе с помощью объектов, возвращаемых функциями dynamic_type() и static_type(). Во многих случаях дополнительная информация должна содержать таблицу членов объекта:       struct Member_info {       char* name;       Type_info* tp;       int offset;       };       class Map_info : public Type_info {       Member_info** mi;       public:       static const Type_info info_obj;       virtual typeid get_info() const;       static typeid info();       // функции доступа       }; Класс Type_info вполне подходит для стандартной библиотеки. Это базовый класс с минимумом необходимой информации, из которого можно получать производные классы, предоставляющие больше информации. Эти производные классы могут определять или сами пользователи, или какие-то служебные программы, работающие с текстом на С++, или сами трансляторы языка.