Бьерн Страуструп - Язык программирования С++. Главы 11-13
Страница 50. Как создать систему динамических запросов о типе



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

 
« Предыдущая статья   Следующая статья »