是否可以在编译时计算数字因子,但没有枚举

时间:2011-07-08 07:23:03

标签: c++ templates

我想在编译时计算阶乘。我找到了解决问题的方法,但我想知道在没有使用enum的情况下是否还有其他解决方案。这是使用enum s。

的解决方案
#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 个答案:

答案 0 :(得分:10)

虽然有其他符号,但它是这样写的,因为更多编译器接受枚举式符号。该语言支持使用内联初始化的const整型类成员,但有些编译器在这方面不符合标准。在这方面符合要求的编译器上,以下工作正常:

#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";
}   

答案 1 :(得分:7)

替换,

enum{value};

用,

static int const value; // or unsigned int

enum是必须的,因为它们假设在编译时被解析。这可以确保您计算的结果必须在编译时完成。其他类型是static int const(表示任何整数类型)。

举例说明:

enum E {
 X = strlen(s); // is an error, because X is a compile time constant
};

答案 2 :(得分:7)

或者,您可以使用静态const成员:

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