Каковы недостатки использования шаблонов? - PullRequest
10 голосов
/ 29 апреля 2010

Некоторые из недостатков:

  1. его синтаксис сложен
  2. компилятор генерирует дополнительный код

Ответы [ 11 ]

24 голосов
/ 29 апреля 2010

Их сложно проверить. Код шаблона, который не используется, обычно вообще не компилируется. Поэтому хороший охват тестовых случаев является обязательным. Но тестирование отнимает много времени, и тогда может оказаться, что код никогда не должен был быть надежным.

22 голосов
/ 29 апреля 2010

Хм, а как же ...

3: компиляция может быть медленной

4: они заставляют вычислять вещи во время компиляции, а не во время выполнения (это также может быть преимуществом, если вы предпочитаете быструю скорость выполнения по сравнению с гибкостью времени выполнения)

5: Старые компиляторы C ++ не обрабатывают их или обрабатывают неправильно

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

12 голосов
/ 29 апреля 2010

Шаблоны предоставляют вашу реализацию клиентам вашего кода, что затрудняет поддержание вашего ABI, если вы передаете шаблонные объекты на границах библиотеки.

10 голосов
/ 29 апреля 2010

Пока что никто не упомянул основной недостаток шаблонов: читабельность кода резко падает!

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

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

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


Несвязанная проблема с шаблонами заключается в том, что отладчикам по-прежнему трудно показывать содержимое контейнеров STL естественным образом (по сравнению, скажем, с массивами в стиле C).

10 голосов
/ 29 апреля 2010

Единственным реальным недостатком является то, что если вы допустите крошечную синтаксическую ошибку в шаблоне (особенно используемую другими шаблонами), сообщения об ошибках не будут полезны ... ожидайте пару страниц почти -неправильная ошибка сообщения ;-). Дефект компилятора очень специфичен для компилятора, а синтаксис, хотя и некрасивый, на самом деле не «сложен». В общем, хотя - несмотря на огромную проблему с правильной диагностикой ошибок - шаблоны по-прежнему единственная лучшая вещь в C ++, единственное, что может соблазнить вас использовать C ++ по сравнению с другими языками с более низкими реализациями дженериков, таких как Java ...

4 голосов
/ 29 апреля 2010

Они слишком сложны для разбора компилятором, что означает, что ваше время компиляции увеличится. Также может быть трудно разобрать сообщения об ошибках компилятора, если у вас есть расширенные конструкции шаблона.

3 голосов
/ 29 апреля 2010

Меньше людей понимают их, особенно на уровне метапрограммирования, поэтому меньше людей могут их поддерживать.

1 голос
/ 29 апреля 2010

Абсолютный худший: сообщения об ошибках компилятора, которые вы получаете из неверного кода шаблона.

1 голос
/ 29 апреля 2010

Недостаток: ошибки шаблона обнаруживаются компилятором только при создании экземпляра шаблона. Иногда ошибки в методах шаблонов обнаруживаются только при создании экземпляра метода-члена, независимо от того, был ли создан экземпляр шаблона.

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

1 голос
/ 29 апреля 2010

Когда вы используете шаблоны, ваш компилятор генерирует только то, что вы на самом деле используете. Я не думаю, что есть какие-либо недостатки в использовании метапрограммирования шаблонов C ++, кроме времени компиляции, которое может быть довольно продолжительным, если вы используете очень сложные структуры, как это делают библиотеки boost или loki.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...