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