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

Сообщение Re: Ключевое отличие шаблона от макроса от 10.07.2023 14:30

Изменено 10.07.2023 14:32 B0FEE664

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

S>Это тот же шаблон класса, только с помощью макросов. И в чем ключевая разница? Что я так уж потерял?


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

void fun(int n)
{
std::cout << "n=" << n << '\n';
}

int main()
{
int n = 1;
fun(n);
float f = 2.1;
fun(f);
return 0;
}
Re: Ключевое отличие шаблона от макроса
Здравствуйте, Shmj, Вы писали:

S>Это тот же шаблон класса, только с помощью макросов. И в чем ключевая разница? Что я так уж потерял?

В отличии от макросов, которые генерируют код, шаблоны сами являются кодом. Соответственно, на шаблонах можно написать то, что не возможно на макросах без шаблонов.
Самый простой приходящий сегодня мне в голову пример — это запрет чего-либо для всех типов, за исключением указанных.
Допустим у нас есть вот такой код:
void fun(int n)
{
   std::cout << "n=" << n << '\n';
}

int main()
{
  int n = 1;
  fun(n);        // n=1
  float f = 2.1;
  fun(f);        // n=2
  return 0;
}


— при выводе f преобразовалось в int и вывод получился не верный.
Я не вижу способа предотвратить такое поведение без шаблонов.