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