Рекурсивный вычислитель факториала через шаблоны C++

Рекурсивному шаблону не хватает базовой специализации F<0> со значением 1. Без неё инстанцирование продолжится к отрицательным аргументам и достигнет ограничения компилятора.

Короткий ответ

Что ответить на собеседовании

Рекурсивному шаблону не хватает базовой специализации 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 и перевод строки. Для больших аргументов требуется иной числовой тип и контроль диапазона: шаблонная рекурсия не устраняет арифметическое переполнение.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее