C++, избегать RTTI и шаблон посетителя, это возможно?
Я смотрел на некоторые связанные темы, но до сих пор не нашел ничего, что отвечает на следующий вопрос.
Допустим, у меня есть иерархия классов (например, виджеты, элемент HTML), которые образуют древовидную структуру. Когда я иду по дереву или ищу конкретный элемент на основе его идентификатора, я получаю указатель на базовый класс (алгоритмы дерева знают только о базовом классе).
Затем, основываясь на типе (базовый класс имеет поле, идентифицирующее тип), я выполняю dynamic_cast для получения указателя на конкретный тип. Я думал о том, как избежать этого. Единственное, что приходит мне в голову, это шаблон посетителей. Но не очень нравится этот шаблон.
Существуют ли другие способы / шаблоны для поиска / итерации узлов и получения указателя на конкретный класс без использования RTTI или шаблона посетителя?
2 ответа
Ваш подход не звучит как хорошая идея. Главным образом потому, что вы должны сделать все соображения до времени выполнения.
То, что вы хотите сделать, это в основном иметь конкретные свойства объекта в списке и доступны. С динамическим приведением это возможно, но вряд ли изящно - поскольку вам нужно заранее написать последовательность команд и жестко закодировать каждую возможность, чтобы вы могли использовать ее во время выполнения.
Решение, которое я рекомендую, как обычно, - это фреймворк Qt. Вы можете перечислить свойства для каждого объекта во время выполнения, получить доступ к определенному свойству по его строке имени или индексу и даже прикрепить свойства во время выполнения, которых нет в коде. И все это зависит от типа, вам не нужно знать тип объекта, чтобы знать его свойства, и, наконец, - Qt предлагает значительно быстрее qobject_cast
для производных классов QObject вместо dynamic_cast
,
Мета-система позволяет вам знать имя класса, имя базового класса, методы, перечисления, конструкторы и почти все, поэтому, кроме свойств, это хороший источник для доступа ко всем функциям, доступным для экземпляра.
Это действительно зависит от реализации шаблона посетителя. Использование dynamic_cast<> - это один из способов, другим может быть использование RTTI, созданного вручную, путем определения виртуальной функции GetType(), которая может быть реализована во всех подклассах. В зависимости от результата этой функции вы можете делать разные вещи.