Вычисление факториала на этапе компиляции при помощи шаблонов C++

Определите основной шаблон как Fac, а не как частичную специализацию Fac<N> с теми же параметрами. Сделайте result публичным и добавьте специализацию для нуля.

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

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

Определите основной шаблон как Fac, а не как частичную специализацию Fac<N> с теми же параметрами. Сделайте result публичным и добавьте специализацию для нуля.

Подробный разбор

Ответ с пояснениями

Условие

Задача состоит в реализации шаблонного класса Fac<N>, который вычисляет факториал числа N во время компиляции, используя рекурсивную специализацию шаблонов. Нужно продемонстрировать, что полученное значение действительно считается на этапе компиляции.

template <unsigned N>
class Fac;

template <unsigned N>
class Fac<N> {
    static constexpr int result = Fac<N - 1>::result * N;
};

template <>
class Fac<0> {
    static constexpr int result = 1;
};

Проверьте, что Fac<5>::result равен 120 и что вычисление происходит на этапе компиляции (например, с помощью static_assert).

Ответ

Определите основной шаблон как Fac, а не как частичную специализацию Fac<N> с теми же параметрами. Сделайте result публичным и добавьте специализацию для нуля.

template<unsigned N>
struct Fac {
    static constexpr unsigned long long result = N * Fac<N - 1>::result;
};

template<>
struct Fac<0> {
    static constexpr unsigned long long result = 1;
};

static_assert(Fac<5>::result == 120);

struct делает член публичным без отдельной секции public. static_assert подтверждает константный результат. Для стандартного 64-битного диапазона точный факториал помещается до 20!; при больших N нужно ограничить параметр или использовать подходящее представление большого числа.

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

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

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

Подробнее