Сообщение Re: Ключевое отличие шаблона от макроса от 10.07.2023 14:30
Изменено 10.07.2023 14:37 B0FEE664
Re: Ключевое отличие шаблона от макроса
Здравствуйте, Shmj, Вы писали:
S>Это тот же шаблон класса, только с помощью макросов. И в чем ключевая разница? Что я так уж потерял?
В отличии от макросов, которые генерируют код, шаблоны сами являются кодом. Соответственно, на шаблонах можно написать то, что не возможно на макросах без шаблонов.
Самый простой приходящий сегодня мне в голову пример — это запрет чего-либо для всех типов, за исключением указанных.
Допустим у нас есть вот такой код:
— при выводе f преобразовалось в int и вывод получился не верный.
Я не вижу способа предотвратить такое поведение без шаблонов.
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>Это тот же шаблон класса, только с помощью макросов. И в чем ключевая разница? Что я так уж потерял?
В отличии от макросов, которые генерируют код, шаблоны сами являются кодом. Соответственно, на шаблонах можно написать то, что не возможно на макросах без шаблонов.
Самый простой приходящий сегодня мне в голову пример — это запрет чего-либо для всех типов, за исключением указанных.
Допустим у нас есть вот такой код:
— при выводе f преобразовалось в int и вывод получился не верный.
Я не вижу способа предотвратить такое поведение без шаблонов.
С помощью шаблона можно предотвратить такое поведение. Следующий код не компилируется:
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;
}