Являются ли шаблоны C ++ просто замаскированными макросами? - PullRequest
53 голосов
/ 08 октября 2008

Я программировал на C ++ в течение нескольких лет, и я довольно часто использовал STL и несколько раз создавал свои собственные классы шаблонов, чтобы посмотреть, как это делается.

Теперь я пытаюсь глубже интегрировать шаблоны в мой ОО-проект, и мне все время возвращается мучительная мысль: на самом деле это всего лишь макросы ... Вы можете реализовать (скорее УГЛЫЙ) auto_ptrs, используя #defines, если ты действительно хотел.

Такой подход к шаблонам помогает мне понять, как на самом деле будет работать мой код, но я чувствую, что, должно быть, как-то упускаю суть. Макросы означают воплощение зла, но «шаблонное метапрограммирование» - все в моде.

Итак, каковы реальные различия? и как шаблоны могут избежать опасностей, к которым приводит вас #define, например

  • Непостижимые ошибки компилятора в места, где вы их не ожидаете?
  • Раздувание кода?
  • Сложность в трассировке кода?
  • Установка точек останова отладчика?

Ответы [ 25 ]

2 голосов
/ 14 декабря 2009

Ключевое слово typename представлено для включения контекстно-вложенных typdef. Они были необходимы для техники признаков, которая позволяет добавлять метаданные к типам (особенно встроенным типам, таким как указатель), это требовалось для написания STL. В остальном ключевое слово typename совпадает с ключевым словом class.

1 голос
/ 15 декабря 2009

Есть некоторые основные проблемы с макросами.

Во-первых, они не уважают объем или тип. Если у меня есть #define max(a, b)..., то всякий раз, когда в моей программе есть токен max, по какой-либо причине он будет заменен. Он будет заменен, если это имя переменной или глубоко внутри вложенных областей. Это может вызвать трудно обнаруживаемые ошибки компиляции. Напротив, шаблоны работают внутри системы типов C ++. Функция шаблона может повторно использовать свое имя в области видимости и не будет пытаться переписать имя переменной.

Во-вторых, макросы не могут быть изменены. Шаблон std::swap обычно просто объявляет временную переменную и выполняет очевидные назначения, потому что это очевидный способ, который обычно работает. Это то, что макрос будет ограничен. Это было бы крайне неэффективно для больших векторов, и поэтому у векторов есть специальный swap, который меняет ссылки, а не весь контент. (Оказывается, это очень важно для вещей, которые программист C ++ не должен писать, но использует.)

В-третьих, макросы не могут делать какие-либо формы вывода типов. Вы не можете написать универсальный макрос подкачки, потому что он должен был бы объявить переменную типа, и он не знает, каким может быть тип. Шаблоны учитывают тип.

Одним из замечательных примеров мощи шаблонов является то, что изначально называлось стандартной библиотекой шаблонов, которая в стандарте представляет собой контейнеры, алгоритмы и итераторы. Посмотрите, как они работают, и подумайте, как бы вы заменили его макросами. Александр Степанов просмотрел множество языков для реализации своих идей STL и пришел к выводу, что C ++ с шаблонами - единственный, на котором он будет работать.

1 голос
/ 08 октября 2008

Это не столько ответ, сколько следствие уже заявленных ответов.

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

Среднестатистический астроном или инженер-электронщик, вероятно, просто отлично умеет работать с макросами, может даже понять, почему следует избегать макросов, но не получит шаблоны достаточно хорошо для повседневного использования. В этом контексте макросы на самом деле лучше. Естественно, существует множество карманов исключений; некоторые физики бегают кругами вокруг профессиональных инженеров-программистов, но это не типично.

0 голосов
/ 08 октября 2014

Шаблоны интегрированы в язык и являются типобезопасными.

Скажите, как бы вы сделали это с макросами. Это тяжелое шаблонное метапрограммирование.

https://www.youtube.com/watch?v=0A9pYr8wevk

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

0 голосов
/ 08 октября 2008

Шаблоны обеспечивают некоторую степень безопасности типов.

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