c++模板元编程编写简单的递归

模板元编程实际上指的就是在模板实例化的同时利用编译器完成一些简单的计算任务。通过模板元编程可以把一些需要运行时计算的任务放到编译时候来做,从而提高程序的运行时的效 率。 

基本操作语法: 

#include<iostream>
using namespace std;
template<int N, int M>
struct meta_func
{
    static const int value = N+M;
    static const int value1 = N+M+3;
};
int main(){
	cout<<meta_func<1,2>::value1;
}

 

示例一:编写简单的递归

 //注:下面这个程序不是自己写的,是郑莉老师的c++程序设计基础上的例子,因为不知道转载的网址,所以只能标成原创。

#include<iostream>
using namespace std;
template<unsigned N>
struct Factorial{
	enum{
		VALUE=N*Factorial<N-1>::VALUE
	};
};
//特化后的模板作为终止条件
template<>
struct Factorial<0>{
	enum{
		VALUE=1
	};
};

int main(){
	cout<<Factorial<6>::VALUE;
}

结果: 720

示例二:递归算乘方

尽管乘方可以通过cmath中的pow函数来算,但是对于次数较小的乘方来说,这样运行时效率较低,不如我们写一个模板元编程,将这个运算放到编译阶段

#include<iostream>
using namespace std;
template<unsigned N>
struct power{
	template<class T>
	static T value(T x){
		return x*power<N-1>::value(x);
	}
};
//递归结束条件 
template< >
struct power<1>{
	template<class T>
	static T value(T x){
		return x;
	} 
};
//下面这个内联函数只是为了方便我们调用时的写法,
template<unsigned N,class T>
inline T Power(T v){
	return v*power<N>::value(v);
}

int main(){
	cout<<Power<10,double>(0.1); //这个就表示0.1的10次方

//要是没有我们编写的方便调用的函数,就得写成下面这样才能调用
//double d=0.1;
//cout<<power<10>::value(x);
}

 

总结:

示例一中value是值,示例二中value是函数名

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ad_m1n

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值