C++模板(4) - 模板元编程

参考下面程序:

#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 << "power value:" << funStruct<8>::val << endl;
    return 0;
}

运行结果:
power value:256

上述程序计算2的8次方。
实际上,结构体funStruct 可以用来计算2的n次方,而n可以是任何已知值或常量。
这个程序的特别之处在于: 计算是在编译期间完成的。所以,实际上是编译器计算了2的8次方。
为了理解编译器是如何做到的,先考虑下面关于模板和枚举的一些事实:

1) 我们可以传递non-type参数(即参数没有数据类型)给类模板/函数模板。
2) 与const表达式类似,枚举常量的值是在编译期间确定的。
3) 当编译器看到有一个新的参数传递给了模板,编译器会创建一个新的模板实例。

仔细回顾上面的程序。当编译器看到funStruct<8>::val时,它会尝试使用参数8创建一个funStruct的实例,然后变成了在编译时计算枚举常量值funStruct<7> 。 
对于funStruct<7>,编译器需要计算funStruct<6>,以此类推。
最后,编译器使用funStruct<1>::val 并且编译递归的停止。
这样,使用模板我们可以写出在编译期间就能做计算的程序,这样的的程序称为模板元编程。
模板元编程实际上是图灵完备的,意味着任何可以使用计算程序来表示的计算任务,在某些情况下,都是可以使用模板元编程来计算的。模板元编程通常不会在实际程序中使用,但它确实是一个有趣的概念。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值