Байланысты: Бьерн Страуструп. Язык программирования С . М Бином, 2011
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; }