Определите основной шаблон как Fac, а не как частичную специализацию Fac<N> с теми же параметрами. Сделайте result публичным и добавьте специализацию для нуля.
Вычисление факториала на этапе компиляции при помощи шаблонов C++
Определите основной шаблон как 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 нужно ограничить параметр или использовать подходящее представление большого числа.