Некоторые недостатки были бы
Их сложно проверить. Код шаблона, который не используется, обычно редко компилируется. Поэтому необходимо хорошее покрытие тестовых примеров. Но тестирование занимает много времени, и тогда может оказаться, что код вообще никогда не нуждался в надежности.
Хм, как насчет ...
3: Они могут медленно компилироваться
4: Они заставляют вещи вычисляться во время компиляции, а не во время выполнения (это также может быть преимуществом, если вы предпочитаете высокую скорость выполнения гибкости во время выполнения)
5: Старые компиляторы C ++ не обрабатывают их или не обрабатывают t обрабатывают их правильно
6: сообщения об ошибках, которые они генерируют, когда вы неправильно понимаете код, могут быть почти непонятными
Единственный реальный недостаток заключается в том, что если вы сделаете небольшую синтаксическую ошибку в шаблоне (особенно в шаблоне, который используется другими шаблонами), сообщения об ошибках не будут полезными ... ожидайте пару страниц сообщений об ошибках, которые почти невозможно использовать ;-) . Дефект компилятора очень специфичен для компилятора, и синтаксис, хотя и уродливый, на самом деле не является «сложным». В целом, однако, несмотря на огромную проблему с правильной диагностикой ошибок, шаблоны по-прежнему единственное лучшее в C ++, единственное, что может соблазнить вас использовать C ++ вместо других языков с более низкими реализациями. дженериков, таких как Java ...
Шаблоны открывают доступ к вашей реализации клиентам вашего кода, что затрудняет поддержку ABI, если вы передаете шаблонные объекты на границах библиотеки.
Их сложно проанализировать компилятором, что означает увеличение времени компиляции. Также может быть сложно проанализировать сообщения об ошибках компилятора, если у вас есть расширенные конструкции шаблонов.
Меньше людей понимают их, особенно на уровне метапрограммирования, поэтому меньше людей могут их поддерживать.
Недостаток: ошибки шаблона обнаруживаются компилятором только при создании экземпляра шаблона. Иногда ошибки в методах шаблонов обнаруживаются только при создании экземпляра метода-члена, независимо от того, создается ли остальная часть шаблона.
Если у меня есть ошибка в методе класса шаблона, на который ссылается только одна функция, но другой код использует шаблон без этого метода, компилятор не сгенерирует ошибку, пока не будет создан экземпляр ошибочного метода.
Когда вы используете шаблоны, ваш компилятор генерирует только то, что вы действительно используете. Я не думаю, что есть какие-либо недостатки в использовании метапрограммирования шаблонов C ++, кроме времени компиляции, которое может быть довольно большим, если вы использовали очень сложные структуры, как это делают библиотеки boost или loki.
Пока что никто, кажется, не упомянул главный недостаток, который я обнаружил у шаблонов: читаемость кода резко падает!
Я не имею в виду проблемы с синтаксисом - да, синтаксис уродлив, но я могу простить это. Я имею в виду следующее: я обнаружил, что с никогда не встречавшимся ранее кодом без шаблонов, каким бы большим ни было приложение, если я начну с main ()
, я обычно могу расшифровать общие черты того, что программа делает без проблем. И код, который просто использует vector
или аналогичный, меня нисколько не беспокоит. Но как только код начинает определять и использовать свои собственные шаблоны для целей, выходящих за рамки простых типов контейнеров, понятность быстро теряется. И это имеет очень негативные последствия для сопровождения кода.
Частично этого нельзя избежать: шаблоны обеспечивают большую выразительность за счет сложных правил разрешения перегрузки частичного порядка (для шаблонов функций) и, в меньшей степени, частичной специализации (для шаблонов классов). Но правила настолько чертовски сложны , что даже авторы компиляторов (которые, я рад признать, на порядок умнее меня) все еще ошибаются в крайних случаях.
Взаимодействие пространств имен, друзей, наследования, перегрузки, автоматических преобразований и поиска в зависимости от аргументов в C ++ уже достаточно сложно. Но когда вы добавляете в смесь шаблоны, а также вносите небольшие изменения в правила поиска имен и автоматических преобразований, с которыми они связаны, сложность может достигать масштабов, с которыми, я бы сказал, ни один человек не справится. Я просто не доверяю себе читать и понимать код, в котором используются все эти конструкции.
Не связанная с этим проблема с шаблонами состоит в том, что отладчики все еще испытывают трудности с естественным отображением содержимого контейнеров STL (по сравнению, скажем, с массивами в стиле C).
Абсолютно худшее: ошибка компилятора. сообщения, которые вы получаете из-за неправильного кода шаблона.