Рекурсивному шаблону не хватает базовой специализации F<0> со значением 1. Без неё инстанцирование продолжится к отрицательным аргументам и достигнет ограничения компилятора.
Рекурсивный вычислитель факториала через шаблоны C++
Рекурсивному шаблону не хватает базовой специализации F<0> со значением 1. Без неё инстанцирование продолжится к отрицательным аргументам и достигнет ограничения компилятора.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Дополните представленный шаблонный код, чтобы он корректно рассчитывал факториал числа во время компиляции.
# include <iostream>
template<int n>
struct F {
enum { value = n * F<n - 1>::value };
};
int main() {
std::cout << F<5>::value << '\n';
}
Ответ
Рекурсивному шаблону не хватает базовой специализации F<0> со значением 1. Без неё инстанцирование продолжится к отрицательным аргументам и достигнет ограничения компилятора.
template<int n>
struct F {
static_assert(n >= 0, "negative factorial");
enum { value = n * F<n - 1>::value };
};
template<>
struct F<0> {
enum { value = 1 };
};
static_assert(F<5>::value == 120);
Специализацию разместите до первого использования F<5>. Исходный cout после этого выводит 120 и перевод строки. Для больших аргументов требуется иной числовой тип и контроль диапазона: шаблонная рекурсия не устраняет арифметическое переполнение.