Пока что никто не упомянул основной недостаток шаблонов: читабельность кода резко падает!
Я не имею в виду проблемы с синтаксисом - да, синтаксис безобразен, но я могу простить это. Я имею в виду следующее: я обнаружил, что с невиданным ранее не шаблонным кодом, каким бы большим ни было приложение, если я начну с main()
, я обычно могу декодировать широкие штрихи того, что программа делает без проблем. И код, который просто использует vector<int>
или подобный, не беспокоит меня ни в малейшей степени. Но как только код начинает определять и использовать свои собственные шаблоны для целей, выходящих за рамки простых типов контейнеров, понятность быстро выходит из окна. И это имеет очень негативные последствия для обслуживания кода.
Часть этого неизбежна: шаблоны обеспечивают большую выразительность благодаря сложным правилам разрешения перегрузки частичного порядка (для шаблонов функций) и, в меньшей степени, частичной специализации (для шаблонов классов). Но правила настолько чертовски сложны , что даже авторы компиляторов (которых я рад признать, что они на порядок умнее меня) по-прежнему ошибаются в угловых случаях.
Взаимодействие пространств имен, друзей, наследования, перегрузки, автоматических преобразований и зависимого от аргументов поиска в C ++ уже достаточно сложно. Но когда вы добавляете шаблоны в смесь, а также небольшие изменения в правилах поиска имен и автоматических преобразований, с которыми они приходят, сложность может достигать таких пропорций, с которыми, я бы сказал, ни один человек не может справиться. Я просто не доверяю себе, чтобы читать и понимать код, который использует все эти конструкции.
Несвязанная проблема с шаблонами заключается в том, что отладчикам по-прежнему трудно показывать содержимое контейнеров STL естественным образом (по сравнению, скажем, с массивами в стиле C).