Информация об изменениях

Сообщение Re: Ключевое отличие шаблона от макроса от 09.07.2023 7:26

Изменено 09.07.2023 8:46 rg45

Re: Ключевое отличие шаблона от макроса
Здравствуйте, Shmj, Вы писали:

S>Вот тут
Автор: rg45
Дата: 07.07.23
чел. пишет:


S>

S>Дальше можно не читать. Одно только то, что ты ставишь макросы и шаблоны в один ряд, красноречиво говорит о твоей квалификации. Как говорится, у Вас не тридцатилетний опыт — у Вас годичный опыт, повторенный тридцать раз.


S>Т.е. заклеймили даже за саму попытку поставить в один ряд. И мне не ясно почему.


Тезисно:
  • Шаблоны обрабатываются копилятором, а макросы обрабатываются препроцессором
  • Макросы не подчиняются правилам пространств имен и областей видимости
  • Макросы не подчиняются правилам поиска имен — name lookup и argument-dependent name lookup
  • Для макросов недоступны специализации и перегрузки
  • Для макросов не предусмотрено ничего похожего на отложенное (неявное) инстанцирование, которое очень востребовано при использовании шаблонов.
  • Макросы не могут рекуррентно использовать сами себя.
  • Для макросов недоступно огромное количество инструментов и паттернов, доступных для шаблонов — концепты, SFINAE, CRTP, variadic packs, template class argument deduction и пр.
  • Макросы небезопасны в плане скрытых побочных эффектов (классический пример — max(++a, ++b))
  • Макросы существенно проблематичнее в отладке и поиске ошибок, чем шаблоны.
  • Наверняка, еще есть что-то, что я навскидку не смог вспомнить

Первый пункт выделен, потому что он мне представляется ключевым и из него следует все остальное. Препроцессор гораздо примитивнее компилятора, его задача — подготовка текста программы для компилятора. У него на входе текст, и на выходе тоже текст. Злоупотребление препроцессором для эмуляции программных сущностей (функций и классов) сродни открыванию консервных банок молотком, или изготовлению мебели топором.
Re: Ключевое отличие шаблона от макроса
Здравствуйте, Shmj, Вы писали:

S>Вот тут
Автор: rg45
Дата: 07.07.23
чел. пишет:


S>

S>Дальше можно не читать. Одно только то, что ты ставишь макросы и шаблоны в один ряд, красноречиво говорит о твоей квалификации. Как говорится, у Вас не тридцатилетний опыт — у Вас годичный опыт, повторенный тридцать раз.


S>Т.е. заклеймили даже за саму попытку поставить в один ряд. И мне не ясно почему.


Тезисно:
  • Шаблоны обрабатываются копилятором, а макросы обрабатываются препроцессором
  • Макросы не подчиняются правилам пространств имен и областей видимости
  • Макросы не подчиняются правилам поиска имен — name lookup и argument-dependent name lookup
  • Для макросов недоступны специализации и перегрузки
  • Для макросов не предусмотрено ничего похожего на отложенное (неявное) инстанцирование, которое очень востребовано при использовании шаблонов.
  • Макросы не могут рекуррентно использовать сами себя.
  • Для макросов недоступно огромное количество инструментов и паттернов, доступных для шаблонов — концепты, SFINAE, CRTP, variadic packs, template class argument deduction и пр.
  • Макросы небезопасны в плане скрытых побочных эффектов (классический пример — max(++a, ++b))
  • Макросы существенно проблематичнее в отладке и поиске ошибок, чем шаблоны.
  • Наверняка, еще есть что-то, что я навскидку не смог вспомнить

Первый пункт выделен, потому что он мне представляется ключевым и из него следует все остальное. Препроцессор гораздо примитивнее компилятора, его задача — подготовка текста программы для компилятора. У него на входе текст, и на выходе тоже текст. Злоупотребление препроцессором для эмуляции программных сущностей (функций и классов) является использованием инструментов не по назначению. Это сродни открыванию консервных банок молотком, или изготовлению мебели топором.