我想在编译时计算阶乘。我找到了解决问题的方法,但我想知道在没有使用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
。
答案 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; }