元编程(Metaprogramming)是指某类计算机程序的编写,这类计算机程序编写或者操纵其他程序(或者自身)作为它们的数据,或者在编译时完成部分本应在运行时完成的工作。很多情况下比手工编写全部代码相比工作效率更高。编写元程序的语言称之为元语言,被操作的语言称之为目标语言。一门语言同时也是自身的元语言的能力称之为反射。
百度百科里元编程例子:
int Result; //主模板 template<int N> //模板 class Fibonacci { public: enum{Result = Fibonacci<N-1>::Result + Fibonacci<N-2>::Result }; //枚举,带有隐含计算 }; //完全特化模板 template<> class Fibonacci<1> //带常参数1的构造函数 { public: enum { Result = 1 }; //给枚举赋初值1 }; //完全特化模板 template<> class Fibonacci<0> //带参数0的模板 { public: enum { Result = 0 }; //给枚举赋初值0 }; int main() { std::cout << "第20项的Fibonacci数是:" << Fibonacci<20>::Result << std::endl; //隐含计算 system("pause"); return 1; }
接下来,编写了一下的代码,测试元编程,模板,函数三种方式实现数组求和的效率如下:
#include "time.h" /*http://blog.csdn.net/sunboyiris?viewmode=list*/ template <typename T> inline T sum_array(int Dim, T* a) { T result = T(); for (int i = 0; i < Dim; ++i) { result += a[i]; } return result; } template <int Dim, typename T> class Sumarray { public: static T result(T* a) { return a[0] + Sumarray<Dim-1, T>::result(a+1); } }; // 作为终结准则的模板 template <typename T> class Sumarray<1, T> { public: static T result(T* a) { return a[0]; } }; //模板实现数组内各元素相加 template<T array> void arraysun(T &v,int sz) { float k=0; for (int i = 0; i < sz; ++i) { k+=v[i]; } cout<<k<<endl; } int main() { float k=0; srand(time(NULL)); clock_t ibegin, iend; int a[3000]; for(int i=0;i<3000;i++) { a[i]=i; } //模板实现测试 ibegin = clock(); arraysun(a,3000); iend = clock(); cout<<endl; cout<<"耗时"<<endl; cout<<iend-ibegin<<endl; //常规函数测试 ibegin = clock(); for(int i=0;i<3000;i++) { k+=a[i]; } cout <<" "<< k; iend = clock(); cout<<endl; cout<<"耗时"<<endl; cout<<iend-ibegin<<endl; //元编程测试 ibegin = clock(); cout <<" "<< Sumarray<3000, int>::result(a); iend = clock(); cout<<endl; cout<<"耗时"<<endl; cout<<iend-ibegin<<endl; system("pause"); return 0; }