// 编译时计算、模板元计算,还有递归在模板中的使用
#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;
}