预测以下C++程序的输出。
null
CPP
#include <iostream> using namespace std; template < int n> struct funStruct { enum { val = 2*funStruct<n-1>::val }; }; template <> struct funStruct<0> { enum { val = 1 }; }; int main() { cout << funStruct<8>::val << endl; return 0; } |
输出:
256
程序计算“2升到8(或2^8)的幂”。事实上 funStruct 可用于计算任何已知n(或常数n)的2^n。上述计划的特殊之处在于: 计算在编译时完成 .所以,计算2^8的是编译器。为了理解编译器是如何做到这一点的,让我们考虑以下关于模板和枚举的事实: 1) 我们可以将非类型参数(非数据类型的参数)传递给类/函数模板。 2) 与其他常量表达式一样,枚举常量的值在编译时计算。 3) 当编译器看到模板的新参数时,编译器会创建模板的新实例。 让我们仔细看看最初的计划。当编译器看到 funStruct<8>:val ,它尝试创建 funStruct 当参数为8时,结果是 funStruct<7> 还必须创建为枚举常量 瓦尔 必须在编译时进行计算。对于 funStruct<7> ,编译器需要 funStruct<6> 等等最后,编译器使用 funStruct<1>:val 编译时递归终止。所以,使用模板,我们可以编写在编译时进行计算的程序,这种程序被称为 模板元程序 .模板元编程实际上是 图灵完备 ,这意味着任何可由计算机程序表达的计算都可以由模板元程序以某种形式进行计算。模板元编程通常不用于实际程序,但这是一个有趣的概念。 如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END