Re: Ключевое отличие шаблона от макроса
От: B0FEE664  
Дата: 10.07.23 14:30
Оценка: 3 (1) +1
Здравствуйте, 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;
}
И каждый день — без права на ошибку...
Отредактировано 10.07.2023 14:37 B0FEE664 . Предыдущая версия . Еще …
Отредактировано 10.07.2023 14:32 B0FEE664 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.