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; }

Назад  |  Вперёд


OtDiatlovaOU
К началу книги

Оформление и дизайн книги OtDiatlovaOU.
Вся книга, архив.