Клас шаблонів схожий на макрос, лише цілий набір менше зла.
Подумайте про шаблон як про макрос. Параметри шаблону підміняються на визначення класу (або функції), коли ви визначаєте клас (або функцію) за допомогою шаблону.
Різниця полягає в тому, що параметри мають "типи", а передані значення перевіряються під час компіляції, як параметри функцій. Дійсні типи - це ваші звичайні типи C ++, такі як int та char. Коли ви створюєте екземпляр класу шаблонів, ви передаєте значення вказаного вами типу, і в новій копії визначення шаблону класу це значення замінюється там, де ім'я параметра було в початковому визначенні. Так само, як макрос.
Ви також можете використовувати типи " class
" або " typename
" для параметрів (вони дійсно однакові). З параметром одного з цих типів ви можете передавати ім'я типу замість значення. Як і раніше, скрізь ім'я параметра було у визначенні класу шаблонів, як тільки ви створюєте новий екземпляр, стає будь-яким типом, який ви передаєте. Це найчастіше використання класу шаблонів; Усі, хто що-небудь знає про шаблони C ++, знають, як це зробити.
Розглянемо приклад цього класу коду шаблону:
#include <cstdio>
template <int I>
class foo
{
void print()
{
printf("%i", I);
}
};
int main()
{
foo<26> f;
f.print();
return 0;
}
Він функціонально такий самий, як і цей код, що використовує макрос:
#include <cstdio>
#define MAKE_A_FOO(I) class foo_##I \
{ \
void print() \
{ \
printf("%i", I); \
} \
};
MAKE_A_FOO(26)
int main()
{
foo_26 f;
f.print();
return 0;
}
Звичайно, версія шаблону в мільярд разів безпечніша та гнучкіша.
static constexpr int
замість вашогоenum
. ТожFactorial<0>
шаблон мав биstatic constexpr int value = 1
іtemplate <int N> struct Factorial
може матиstatic constexpr int value = N * Factorial<N - 1>::value;