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

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

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

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 и вывод получился не верный.
Я не вижу способа предотвратить такое поведение без шаблонов.
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 и вывод получился не верный.
Я не вижу способа предотвратить такое поведение без шаблонов.
С помощью шаблона можно предотвратить такое поведение. Следующий код не компилируется:
void fun(int n)
{
   std::cout << "n=" << n << '\n';
}


template <class T>
void fun(T) = delete; // forbid all implicit conversions


int main()
{
  int n = 1;
  fun(n);        // n=1
  float f = 2.1;
  fun(f);        // error: use of deleted function ‘void fun(T) [with T = float]’
  return 0;
}