Общая информация о шаблонах:
Шаблоны полезны в любое время, когда вам нужно использовать один и тот же код, но работающий с разными типами данных, где типы известны во время компиляции. А также, когда у вас есть какой-либо объект-контейнер.
Очень распространенное использование - практически для каждого типа структуры данных. Например: односвязные списки, двусвязные списки, деревья, попытки, хеш-таблицы, ...
Другое очень распространенное использование - алгоритмы сортировки.
Одним из основных преимуществ использования шаблонов является то, что вы можете удалить дублирование кода. Дублирование кода - это одна из самых важных вещей, которую следует избегать при программировании.
Вы можете реализовать функцию Max в качестве макроса или шаблона, но реализация шаблона будет безопасна по типу и, следовательно, лучше.
А теперь самое интересное:
Также см. шаблон метапрограммирования , который является способом предварительной оценки кода во время компиляции, а не во время выполнения. Шаблонное метапрограммирование имеет только неизменные переменные, и поэтому его переменные не могут изменяться. Из-за этого шаблона метапрограммирование можно рассматривать как тип функционального программирования.
Посмотрите на этот пример шаблонного метапрограммирования из Википедии. Он показывает, как шаблоны могут использоваться для выполнения кода во время компиляции . Поэтому во время выполнения у вас есть заранее вычисленная константа.
template <int N>
struct Factorial
{
enum { value = N * Factorial<N - 1>::value };
};
template <>
struct Factorial<0>
{
enum { value = 1 };
};
// Factorial<4>::value == 24
// Factorial<0>::value == 1
void foo()
{
int x = Factorial<4>::value; // == 24
int y = Factorial<0>::value; // == 1
}