我想在编译时计算阶乘.我找到了解决问题的方法,但我想知道是否有任何其他解决方案可以解决这个问题而不使用enums.这里使用enums 的解决方案.
#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;
}
Run Code Online (Sandbox Code Playgroud)
如果没有其他解决方案,请说明为什么enum必须这样做.
Dav*_*men 11
虽然有其他符号,但它是用这种方式编写的,因为更多编译器接受枚举式符号.该语言支持使用内联初始化的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";
}
Run Code Online (Sandbox Code Playgroud)
更换,
enum{value};
Run Code Online (Sandbox Code Playgroud)
用,
static int const value; // or unsigned int
Run Code Online (Sandbox Code Playgroud)
enums是必须的,因为他们认为在编译时要解决.这可以确保您计算的结果必须在编译时完成.其他类型是static int const(意味着任何整体类型).
为了显示:
enum E {
X = strlen(s); // is an error, because X is a compile time constant
};
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用静态const成员:
template <unsigned int n>
struct fact { static const unsigned int value = n * fact<n-1>::value; }
Run Code Online (Sandbox Code Playgroud)