Пример: вычисление факториала

Задача: Вычислить произведение чисел от 1 до N во время компилляции.

Решение этой задачи сводится к факту, что каждое последующее значение зависит от предыдущего: P(N) = N * P(N-1). Исключение составляет только начальное значение, то есть для N = 1 => P(N) = 1. Шаблоны позволяют реализовать рекурсивное инстанциирование (определение) типов при помощи специализации шаблонов.

При помощи шаблонов задача решается следующим образом (tpl_product.cpp):

tpl_factorial.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