Пример: вычисление факториала
Задача: Вычислить произведение чисел от 1 до N во время компилляции.
Решение этой задачи сводится к факту, что каждое последующее значение зависит от предыдущего: P(N) = N * P(N-1). Исключение составляет только начальное значение, то есть для N = 1 => P(N) = 1. Шаблоны позволяют реализовать рекурсивное инстанциирование (определение) типов при помощи специализации шаблонов.
При помощи шаблонов задача решается следующим образом (tpl_product.cpp):
#include <iostream>
template<size_t value>
struct factorial {
enum {
RESULT = value * factorial<value - 1>::RESULT
};
};
template<>
struct factorial<0> {
enum { RESULT = 1 };
};
int main() {
std::cout << "factorial = " << factorial<10>::RESULT;
return 0;
}
Использование рекурсии в шаблонах ограничено, так как компилятор при специализации опускается до определенного уровня (зависит от настроек компилятора). Таким образом, произведение 100 первых чисел вычислить уже не удасться.
Last updated