模板元编程实际上指的就是在模板实例化的同时利用编译器完成一些简单的计算任务。通过模板元编程可以把一些需要运行时计算的任务放到编译时候来做,从而提高程序的运行时的效 率。
基本操作语法:
#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是函数名