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

Sam*_*yan 8 c++ templates

我想在编译时计算阶乘.我找到了解决问题的方法,但我想知道是否有任何其他解决方案可以解决这个问题而不使用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)


iam*_*ind 7

更换,

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)


Ker*_* SB 7

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

template <unsigned int n>
struct fact { static const unsigned int value = n * fact<n-1>::value; }
Run Code Online (Sandbox Code Playgroud)