Подтвердить что ты не робот

Стратегия стратегии С++

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

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

Оглядевшись совсем недавно, я вижу, что шаблон стратегии всегда кажется объясненным/определенным с помощью иерархии наследования, например:

Разработка шаблона стратегии

является ли это различием мнений/реализации или является указателем функции, который не является действительно вариацией шаблона стратегии? Меня больше всего интересует, поэтому я не путаю людей, когда комментирую или объясняю свой код:)

4b9b3361

Ответ 1

Вам просто нужно использовать наследование на языках без указателей функций (читайте: Java).

Лично я бы предпочел std::function над необработанными указателями функций, потому что он принимает более широкий диапазон аргументов и позволяет сохранять состояние в объекте стратегии.

Кроме того, если вы уже знаете стратегию во время компиляции, вы можете даже использовать шаблоны и, таким образом, сохранять как служебные данные пространства и времени выполнения указателей функций, так и объектов std::function.

Ответ 2

На мой взгляд, реализация шаблона стратегии с использованием указателей функций выполняется на языках, которые не поддерживают OOP (например, C).

В языках, поддерживающих ООП, его лучше реализовать с помощью классов: наследование, виртуальные функции (например, полиморфизм времени выполнения), интерфейс и т.д. Обычно это шаблон стратегии выполнения, что означает, что вы можете изменить поведение программы, просто переключившись на другой шаблон стратегии во время выполнения.

В С++ существует также шаблон стратегии времени компиляции, обычно известный как политический дизайн.

В любом случае классы могут поддерживать состояния, в то время как указатели на функции не могут. Это самое большое преимущество в использовании классов.

Ответ 3

Использование указателей функций для реализации стратегии - это своего рода вырожденный случай версии наследования. Существенным ядром шаблона является, как вы знаете, возможность поставлять или изменять компонент какого-либо процесса во время выполнения. Этот компонент может быть функцией, или это может быть объект. Если стратегия состоит из нескольких битов, версия наследования действительно лучше, поскольку объект может объединить несколько методов; если есть только одна часть, то указатели на функции в значительной степени хороши.

Ответ 4

Объекты интерфейса могут иметь состояние и, следовательно, поддерживать переменные-члены. Указатели функций не могут.

Ответ 5

IMO, шаблон starategy может быть реализован с использованием:

  • Шаблоны и константы постоянной времени компиляции (ранняя привязка, на самом деле не может быть названа как шаблон стратегии).
  • Механизм виртуальных функций (Да, назначая разные производные классы ссылке/указателю).
  • Указатели функций
  • Указатель-к-членам (методы) класса.
  • Использование std:: function и использование lambdas.