C ++, избегать RTTI и шаблон посетителя, это возможно?

Я смотрел на некоторые связанные темы, но до сих пор не нашел ничего, что отвечает на следующий вопрос.

Допустим, у меня есть иерархия классов (например, виджеты, элемент HTML), которые образуют древовидную структуру. Когда я иду по дереву или ищу конкретный элемент на основе его идентификатора, я получаю указатель на базовый класс (алгоритмы дерева знают только о базовом классе).

Затем, основываясь на типе (базовый класс имеет поле, идентифицирующее тип), я выполняю dynamic_cast для получения указателя на конкретный тип. Я думал о том, как избежать этого. Единственное, что приходит мне в голову, это шаблон посетителей. Но не очень нравится этот шаблон.

Существуют ли другие способы / шаблоны для поиска / итерации узлов и получения указателя на конкретный класс без использования RTTI или шаблона посетителя?

3

Решение

Ваш подход не звучит как хорошая идея. Главным образом потому, что вы должны сделать все соображения до времени выполнения.

То, что вы хотите сделать, это в основном иметь конкретные свойства объекта в списке и доступны. С динамическим приведением это возможно, но вряд ли изящно — поскольку вам нужно заранее написать последовательность команд и жестко закодировать каждую возможность, чтобы вы могли использовать ее во время выполнения.

Решение, которое я рекомендую, как обычно, — это фреймворк Qt. Вы можете перечислить свойства для каждого объекта во время выполнения, получить доступ к определенному свойству по его строке имени или индексу и даже прикрепить свойства во время выполнения, которых нет в коде. И все это зависит от типа, вам не нужно знать тип объекта, чтобы знать его свойства, и, наконец, — Qt предлагает значительно быстрее qobject_cast для производных классов QObject вместо dynamic_cast,

Мета-система позволяет вам знать имя класса, имя базового класса, методы, перечисления, конструкторы и почти все, поэтому, кроме свойств, это хороший источник для доступа ко всем функциям, доступным для экземпляра.

0

Другие решения

Это действительно зависит от реализации шаблона посетителя. Использование dynamic_cast<> это один из способов, другой может заключаться в использовании RTTI, созданного вручную, путем определения виртуальной функции GetType (), которая может быть реализована во всех подклассах. В зависимости от результата этой функции вы можете делать разные вещи.

0

По вопросам рекламы [email protected]