C++模板元编程

主要思想
利用模板特化机制实现编译期条件选择结构,利用递归模板实现编译期循环结构,模板元程序则由编译器在编译期解释执行。
优劣及适用情况
通过将计算从运行期转移至编译期,在结果程序启动之前做尽可能多的工作,最终获得速度更快的程序。也就是说模板元编程的优势在于:
1.以编译耗时为代价换来卓越的运行期性能(一般用于为性能要求严格的数值计算换取更高的性能)。通常来说,一个有意义的程序的运行次数(或服役时间)总是远远超过编译次数(或编译时间)。
2.提供编译期类型计算,通常这才是模板元编程大放异彩的地方。
模板元编程技术并非都是优点:
1.代码可读性差,以类模板的方式描述算法也许有点抽象。
2.调试困难,元程序执行于编译期,没有用于单步跟踪元程序执行的调试器(用于设置断点、察看数据等)。程序员可做的只能是等待编译过程失败,然后人工破译编译器倾泻到屏幕上的错误信息。
3.编译时间长,通常带有模板元程序的程序生成的代码尺寸要比普通程序的大,

4.可移植性较差,对于模板元编程使用的高级模板特性,不同的编译器的支持度不同。


#include<iostream>
using std::cout;
using std::cin;
#include <sys/timeb.h>
long long getTime();

//模板元解决递归问题,把运行的时间转换成编译期间
template<int N>
struct data
{
	enum{ res = data<N - 1>::res + data<N - 2>::res };
};

template<>  //处理特例
struct data<1>
{
	enum{res=1};
};
template<>
struct data<2>
{
	enum{ res = 1};
};

int get_data(int n)
{
	if (n== 1 || n == 2)
	{
		return 1;
	}
	return get_data(n - 1) + get_data(n-2);
}

void main()
{
	long long start = 0;
	const int a = 40; 
	start = getTime();
	cout << data<a>::res << std::endl; //<>内部不可以有变量
	cout << "使用模板元耗时:" << getTime()-start <<"ms"<<std::endl;

	start = getTime();
	cout << get_data(a) << std::endl;
	cout << "使用递归耗时:" << getTime() - start <<"ms"<< std::endl;
	cin.get();
}

long long getTime() {
	struct timeb t;
	ftime(&t);
	return 1000 * t.time + t.millitm;
}

参考文献:http://www.cnblogs.com/salomon/archive/2012/06/04/2534787.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值