模板元的简单学习

特别值得注意的是,因为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.youkuaiyun.com/pandaxcl/article/details/665409

http://blog.youkuaiyun.com/ugg/article/details/2703326


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值