C ++: сомнения относительно шаблона посетителя

Я знаю, что такое шаблон посетителя и как его использовать; этот вопрос не дублирует этот вопрос .


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

Часто Мне нужно добавить функции в некоторые классы, но без добавления этих новых функций в библиотеку. Позвольте мне использовать реальный пример:

В этой библиотеке у меня есть класс Shape , унаследованный от CircleShape , PolygonShape и CompositeShape .

Сейчас я разрабатываю графическое приложение, в котором мне нужно визуализировать эти Shape , но не Я не хочу поместить виртуальную функцию render в основной класс Shape , поскольку некоторые из моих проектов, которые используют Shape , не выполняют никакого рендеринга, а другие графические проекты могут использовать разные механизмы рендеринга (я использую Qt для этого проекта, но для игры я бы использовал OpenGL, поэтому для функции render потребуются разные реализации).

Самый известный способ для этого, конечно, используется шаблон посетителя, но это вызывает у меня несколько сомнений:

Любой класс любой библиотеки может нуждаться в расширении, как это делает моя Shape . Большинство публичных библиотек (почти все) не поддерживают Visitor Pattern; Зачем? почему я должен?

Шаблон посетителя - это способ имитации двойной диспетчеризации в C ++. Это не является родным для C ++, и требует явной реализации, что усложняет интерфейс класса: я не думаю, что функция applyVisitor должна быть на том же уровне, что и функции моего класса, я считаю это нарушением абстракции.

Явное преобразование формы с помощью dynamic_cast обходится дороже, но мне кажется, что это более чистое решение.


Итак, что мне делать? Реализовать двойную диспетчеризацию во всех классах моей библиотеки? Что, если библиотека, предоставляющая Shape , была не моей, а какой-то библиотекой GPL, найденной в Интернете?

9
задан Community 23 May 2017 в 10:28
поделиться