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