Re: Шаблоны и дружественные функции.
Добавлено: 02 мар 2010, 12:54
Это определение шаблона. Слова "и макросы" следует исключить. Макрос - это тупая подстановка куска кода, причём ещё до начала работы компилятора. После работы препроцессора никаких макросов в коде не остаётся. Красивые слова "обобщённый алгоритм" не применимы к макросам вообще. Ну или применимы не более, чем молоток в авиастроении. Постучать, конечно, можно, но это далеко не основной инструмент и всего процесса он не покрывает.BulldozerBSG писал(а): Шаблоны как и макросы используются для кодирования обобщенных алгоритмов без привязки к типам данных и т.п
У шаблонов привязка к типам данных как раз осуществляется. Это не просто замена куска кода. Для каждого типа генерируется свой инстанс класса/функции, которые отличаются mangle именем и не могут быть бездумно применены к любым типам после инстанцирования.BulldozerBSG писал(а): без привязки к типам данных
Машинный код генерится не во всех случаях их использования (например при объявлении поинтера или ссылки на объект типа шаблона-класса интанцирование не производится). Если тело шаблона не видно в скопе инстанцирования, но видна декларация, то вместо ошибки компиляции будем иметь ошибку линковщика. То есть код вызова шаблона будет генерироваться даже при отсутствии тела шаблона! Если мы посмотрим с этой же стороны на макросы, то увидим, что там нет понятия декларации и имплементации вообще, так что сравнению не подлежит.BulldozerBSG писал(а): А в обоих случаях машинный код будет генерироваться только при их использовании.
Далее то тексту. На шаблоны отлично работают namespace, на макросы нет. Макрос можно undef-ить, шаблон нет. В макросах можно склеивать куски кода в один монолит (используя ##), в то время как для шаблона - этот нонсен, это ведь компилируемая сущность. Ну и то, что макросы резолвятся на этапе препроцессинга, а шаблоны процессятся на этапе компиляции, это отличие ты и сам указал. Кстати, последнее отличие является основополагающим. Собственно, после его упоминания, все дальнейшие попытки сравнить будут неблагодарными.
Короче по всем пунктам тотальное отличие.