特别值得注意的是,因为C++的模板语言是在编译器编译的时候完成的,所以又称为静态语言,通常的C++语言又称为动态语言或者运行时语言。正是因为模板语言是在编译期完成的,所以我们可以借助于这种编译期的计算实现代码自动生成的目的,从而实现C++自动化编程。 编译期 宏typedef影射static类型变量和函数const 类型变量=,:?,-运算符enum运行期 对象使用函数调用变量赋值操作变量时&,+=,++,--等运算符。 所以,如果想实现模板元编程,必须要把握的是一定要在编译期完成程序,而不是在程序的运行期,仔细区分运行期和编译期是模板元编程的第一步。#include <iostream> //编译期四则计算的示例代码 template<size_t i,size_t j> struct Add { enum{value = i+j}; }; template<size_t i,size_t j> struct Sub { enum{value = i-j}; }; template<size_t i,size_t j> struct Mul { enum{value = i*j}; }; template<size_t i,size_t j> struct Div { enum{value = i/j}; }; int main() { std::cout << "4+2=" << Add<4,2>::value << std::endl; std::cout << "4-2=" << Sub<4,2>::value << std::endl; std::cout << "4*2=" << Mul<4,2>::value << std::endl; std::cout << "4/2=" << Div<4,2>::value << std::endl; //为了证明上面的计算是在编译期进行的,我们编写下面的代码测试 //将模板值作为数组定义时使用的参数就可以证明是在编译期执行的计算:) int a[Add<4,2>::value];//这么定义并没有错 int b[Sub<4,2>::value];//这么定义并没有错 int c[Mul<4,2>::value];//这么定义并没有错 int d[Div<4,2>::value];//这么定义并没有错 std::cout << sizeof(a)/sizeof(int) << std::endl; std::cout << sizeof(b)/sizeof(int) << std::endl; std::cout << sizeof(c)/sizeof(int) << std::endl; std::cout << sizeof(d)/sizeof(int) << std::endl; return 0; }运行结果:
2 利用模板元实现递归和循环
#include <iostream> using namespace std; //求阶乘 template<int N> struct power{ enum {value = N * power<N - 1>::value};//循环递归过程 }; template<> struct power<0>{ enum { value = 1} ; //0的阶乘是1,也是循环的终止条件 }; //求和 template<unsigned int N>struct sum{ enum{value = N + sum< N - 1 >::value}; }; template<> struct sum<1>{ enum{value = 1}; }; void main(){ int a[power<2>::value]; cout<<sizeof(a) / sizeof(int)<<" "; int b[sum<3>::value]; cout<<sizeof(b) / sizeof(int)<<" "; }运行结果:
参考文章:
http://blog.csdn.net/pandaxcl/article/details/665409
http://blog.csdn.net/ugg/article/details/2703326
模板元的简单学习
时间: 2024-11-08 08:18:56