编译时计算、模板元计算,还有递归在模板中的使用

// 编译时计算、模板元计算,还有递归在模板中的使用

#include "stdafx.h"

#include <iostream>
using namespace std;

//实现1..N的递加
template <int N>
class my {
public:
 enum {fare = my<N-1>::fare + N}; 
};

template<> class my<0> {
public:
 enum {fare = 0};
};

//实现power(N,M)
template <int N, int M>
class mypower {
public:
 enum {
  fare = N * mypower<N,M-1>::fare
 };
};
template <int N> //半特化
class mypower<N,0> {
public:
 enum {
  fare = 1
 };
};


//实现菲波那契数组的递归
template <int N>
class fib {
public:
 const static long long fare = fib<N-1>::fare + fib<N-2>::fare;
};

template <>
class fib<1> {
public:
 const static long long fare  = 1;
};

template <>
class fib<0> {
public:
 const static long long fare  = 1;
};

//N! = N* (N-1)* …… *2 *1
template <int N>
class N_plus_to_1 {
public:
 const static long long fare = N * N_plus_to_1<N-1>::fare;
};

template <>
class N_plus_to_1<1> {
public:
 const static long long fare = 1;
};

//再来一个比较难的,模板有int,也有类
template <int N>
class Line {
public:
 const static long long fare  = N;
};

template <int N>
class Square {
public:
 const static long long fare  = N * N;
};

template <int N>
class Cube {
public:
 const static long long fare  = N * N * N;
};

template <int N, template <int N> class T>
class My_define {
public:
 /*
  完全特化,此时T只是一个适合传入的类名,而不用也不可以写成T<N-1>形式
 */
 const static long long fare = My_define<N-1, T>::fare + T<N>::fare ;
};

template <template <int> class T> //依旧是半特化,或者说是局部特化
class My_define<0,T> {
public:
 const static long long fare  = 0 +T<0>::fare;
};

int _tmain(int argc, _TCHAR* argv[])
{
 cout << my<10>::fare << endl;
 cout << mypower<2,10>::fare << endl;
 cout << fib<90>::fare <<endl; //本来用100的,结果发生溢出,还是用90吧。
 cout << N_plus_to_1<20>::fare <<endl; //21就溢出了哦

 cout << My_define<2,Line >::fare <<endl;
 cout << My_define<2,Square >::fare <<endl;
 cout << My_define<2,Cube >::fare <<endl;
 return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值