我已经尝试了网上所有可用的资源,还无法理解模板的概念和语法。
template <int N>
struct Factorial
{
enum { value = N * Factorial<N - 1>::value };
};
template <>
struct Factorial<0>
{
enum { value = 1 };
};
// Factorial<4>::value == 24
// Factorial<0>::value == 1
void foo()
{
int x = Factorial<4>::value; // == 24
int y = Factorial<0>::value; // == 1
}
与value
相关联的Factorial<4>::value
是什么
为什么我们在这里需要enum
。
struct Factorial<0>
和struct Factorial
有什么区别,为什么我要像struct Factorial<4>
一样声明,为什么给出错误?
答案 0 :(得分:2)
与
value
关联的Factorial<4>::value
是什么
它是匿名enum
的成员,它是通过计算初始化的。为了找到它的价值,编译器必须知道Factorial<3>::value
,这需要Factorial<2>::value
,这需要Factorial<1>::value
,这需要Factorial<0>::value
。
struct Factorial<0>
和struct Factorial
之间有什么区别
template <> struct Factorial<0>
是基础template <int N> struct Factorial
的{{3}},仅在int
模板参数为0
时适用。在此处提供它可以阻止可能发生的无限回归。