В какой мере современные C++ устраняют потребность в шаблонах проектирования?

Книга Design Patterns от GoF, вышедшая в 1994 году, была написана с учетом C++, как и языков, и многие примеры кода были приведены в C++. Программисты других языков считали, что их языкам не нужны эти 23 шаблона проектирования, поскольку эти языки имеют функции, которые сделали многие из шаблонов излишними.

Из Википедии:

Основная критика шаблонов проектирования заключается в том, что его шаблоны являются обходными решениями для недостающих функций в C++, заменяя элегантные абстрактные функции длинными конкретными шаблонами, по существу становясь "человеческим компилятором" или "генерируя вручную расширения какого-то макроса". Питер Норвиг демонстрирует, что 16 из 23 шаблонов в Design Patterns упрощены или устранены (через прямую поддержку языков) в Lisp или Dylan.

C++ претерпел пять изменений с момента выпуска книги "Образцы дизайна" (в 98, 03, 11, 14, 17). Поэтому вопрос в том, насколько современный C++ упрощает или устраняет необходимость в этих 23 шаблонах проектирования?

Было бы неплохо перечислить шаблон проектирования вместе с языком C++, который устраняет или упрощает необходимость в этом шаблоне.

Ответ 1

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

Ответ 2

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

Например, как указано в комментариях, шаблон Command может быть смоделирован с помощью std::function или любого другого вызываемого.

Но модели не делают понятия ненужными. Концепции - очень полезный инструмент для мышления и проектирования, тогда как модели при внедрении.