Это пример метапрограммирования шаблона.Эта программа вычисляет факториал во время компиляции, используя рекурсию.Основа рекурсии здесь:
template<>
struct factorial<1> {
enum { value = 1 };
};
Он говорит, что факториал 1 равен 1.
В другом шаблоне просто говорится, что факториал числа - это число, умноженное на факториал минус 1.
template<int T>
struct factorial {
enum { value = factorial<T - 1>::value * T };
};
Поскольку в классическом смысле «вызова» действительно не существует, шаблон создает экземпляр сам с аргументом шаблона, равным T-1
, вычисляемому во время компиляции.
PS Предупреждение показывает, что факториал 34 переполняет 32-разрядное целое число.