С помощью шаблонов можно перенести часть нетривиальных расчетов на этап компиляции.
Вот
примерпример:
template «int N»
class Pow3
{
public:
enum { result = 3 * Pow3«N-1»::result };
};
template «0»
class Pow3
{
public:
enum { result = 1 };
};
В коде:
cout << Pow3«7»::result;
Результат: 2187
Как работает:
При инстанциировании шаблонного класса Pow3 компилятор подставляет вместо Pow3::result выражение 3 * Pow3, которое разворачивается в 3 * 3 * Pow3 и т.д. до 3 * 3 * 3 * 3 * 3 * 3 * 3 * Pow3, которое разворачивается по специализации шаблона в 3 * 3 * 3 * 3 * 3 * 3 * 3 * 1.
Далее полученное выражение рассчитывается по всем правилам - как константа и подсовывается на этапе исполнения.Я все больше и больше понимаю, что нихрена не знаю о шаблонах.