元编程的传递值应该在哪里
metaprogramming passing value where type should be?
我使用了
的示例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
的值,您的编译器可能不支持许多级别的模板递归)。另外,这增加了代码大小。
这是为了如何 - 为什么这是因为标准允许的。
相关文章:
- C++我需要了解在哪里使用指针和双指针
- 未定义的引用在哪里
- 谷歌测试中的期望值存储在哪里
- 尽管遵循了规则,内存泄漏在哪里
- 静态数据成员模板专用化的实例化点在哪里
- 在哪里放置我的函数?进入我的母语 Gui 还是进入我的演示者?
- 在哪里声明结构运算符重载
- C++ 中的自定义异常:在哪里定义它们?
- 常量参数存储在哪里 (C++)?
- 如何在 c++ 中确定一条指令(以字节为单位)在哪里结束,另一条指令从哪里开始?
- 此递归函数的每次迭代的值存储在哪里?
- 如何告诉本机节点模块所需的dll存储在哪里?
- 在哪里存储跨平台C++应用存储?
- C++泛型类错误,问题出在哪里?
- 在标准中,模板参数的语法在哪里定义,例如,'std::function<int(char)>'?
- 将类作为主要参数的语法在哪里需要?
- 在基本的GUI编程中,在哪里声明对象和方法
- 元编程的传递值应该在哪里
- 在哪里学习硬件编程
- 我如何以编程方式确定我的c++运行时库在哪里