元编程的传递值应该在哪里

metaprogramming passing value where type should be?

本文关键字:在哪里 编程      更新时间:2023-10-16

我使用了

的示例

http://en.wikipedia.org/wiki/template_metaprogramming

const unsigned long long y = Factorial<0>::value; // == 1  

我了解编译器可以进行类型检查,但我认为您不能将0放在应该的位置,并且将其视为值。

有人可以解释这是如何工作的吗?

谢谢

我不认为您可以将0放在类型的位置,并且将其作为值

将其视为

问题是假设:不是"应该在哪里"。相反,它是"指定模板参数可以指定的"。

在这种情况下,有 nontype模板参数

它起作用,仅仅是因为它与类型模板参数不同。

就是这样。我可以推荐C 模板:该列表中的完整指南或许多其他书籍以阅读C 模板的基础知识。

  • 确定的C 书指南和列表

在该特定示例中:

template <int N>
struct Factorial {
    enum { value = N * Factorial<N - 1>::value };
};
template <>
struct Factorial<0> {
    enum { value = 1 };
};

编译器递归生成类。请记住,模板本身不是类,只是一组生成类的规则。

最初,仅存在Factorial<0>。然后你写:

const int x = Factorial<4>::value;

告诉它,它需要生成类Factorial<4>的类别,该类将转化为:

template <>
struct Factorial<4> {
    enum { value = 4 * Factorial<3>::value };
};

再次告诉它生成类Factorial<3>等。当它到达Factorial<0>时,这停止了,因为它已经定义,并且不需要生成新的类即可计算其value成员。

基本上,它将计算从运行时移动到编译时间。请注意,这并不总是可行(根据N的值,您的编译器可能不支持许多级别的模板递归)。另外,这增加了代码大小。

这是为了如何 - 为什么这是因为标准允许的。