Можно ли рассчитать число факториалов во время компиляции, но без перечислений - PullRequest
8 голосов
/ 08 июля 2011

Я хочу вычислить факториал во время компиляции. Я нашел способ решить проблему, но я хочу знать, есть ли другое решение для этой проблемы без использования enum s Здесь решение с использованием enum с.

#include <iostream>
template <int n>
struct fact
{
    enum{value = n*fact<n-1>::value};
};

template<>
struct fact<1>
{
    enum{value = 1};
};

int main()
{
    std::cout << fact<10>::value;
}

Если другого решения не существует, опишите, почему enum обязательны.

Ответы [ 3 ]

10 голосов
/ 08 июля 2011

Хотя существуют альтернативные нотации, это написано так, потому что все больше компиляторов принимают эту нотацию в стиле enum.Язык поддерживает константные члены класса интегрального типа со встроенной инициализацией, но некоторые компиляторы не соответствуют стандарту в этом отношении.На компиляторах, которые совместимы в этом отношении, следующее прекрасно работает:

#include <iostream>
template <unsigned int n>
struct fact
{   
    static const unsigned int value = n*fact<n-1>::value;
};  

template<>
struct fact<0>
{   
    static const unsigned int value = 1;
};  

int main()
{   
    std::cout << fact<10>::value << "\n";
}   
7 голосов
/ 08 июля 2011

Кроме того, вы можете использовать статические константные члены:

template <unsigned int n>
struct fact { static const unsigned int value = n * fact<n-1>::value; }
7 голосов
/ 08 июля 2011

Заменить,

enum{value};

на,

static int const value; // or unsigned int

enum s необходимо, поскольку они предполагаются разрешенными во время компиляции.Это гарантирует, что любой результат, который вы вычислили, должен был быть сделан во время компиляции.Другой такой тип static int const (означает любой целочисленный тип).

Для иллюстрации:

enum E {
 X = strlen(s); // is an error, because X is a compile time constant
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...