Я нарисую один пример из реальной жизни, где я использовал несколько шаблонных методов.
В приложении с алгоритмом компьютерного зрения на C ++ поведение алгоритма было разработано таким образом, чтобы предполагать несколько разновидностей поведения алгоритма, основанных на некоторых опциях, считанных во время выполнения в соответствии с перечислением, помещенным в файл конфигурации, загруженный при запуске. Общий каркас алгоритма был идентичен, за исключением некоторых ключевых обратных вызовов, вставленных в середине того, что в противном случае было бы идентичным фрагментом кода, который был бы жестоко дублирован только для вызова различных функций на этом уровне. Эти обратные вызовы, которые я хотел использовать, были абстрагированы в базовый класс метода шаблона, а шаблон метода шаблона предотвратил все это дублирование кода. Перечисление, которое мы использовали, в основном продиктовало, на какой подкласс я установил указатель моего базового класса, чтобы указывать на него, и таким образом придать алгоритму связанный с ним вкус.
Теперь некоторые из мотивов этого разнообразия разновидностей алгоритма работы были онлайн и офлайн функциональностью программного обеспечения, которое контролировало наш инструмент. Оффлайн-версия обеспечивала более богатый выход для отладки / диагностики и поддерживала систему координат, локальную для некоторых пикселей изображения, в то время как онлайн-версия сохраняла все в абсолютном координатном пространстве и поддерживала проблемы, характерные для работающего инструмента со всей его робототехникой, а что нет. Другое перечисление привело к выбору из набора классификаторов, которые мы использовали для некоторого машинного обучения, так как различные классификаторы обучались с использованием различных наборов данных, которые в противном случае проходили бы одинаково в теле кода, но их необходимо было интерпретировать по-разному, основываясь на некоторых определяющих условиях для того, как эти данные были созданы.
Я полагаю, что этот вариант использования возник из-за так называемой дыры в середине проблемы.