全特化终结这个递归模板

来源:互联网 发布:软件项目管理内容 编辑:程序博客网 时间:2024/06/17 00:49
#include  "stdafx.h"
#include<iostream>    


using namespace std;




template<typename  T>
class  A
{
private:
A<void*> impl;  // 有个问题: A<T> 之中包含另一个 A<void*> 成员, 构成递归声明
public:
void test(T* p)
{
impl.test(p);
}
};




/*
上面报错误 C2460 “List<void *>::impl”: 使用正在定义的“List<void *>
下面加以一个全特化,终结这个递归圈
*/




template<>
class A<void*>
{
public:
inline void test(void* p)
{
cout << "test: " << p << endl;
}
};




//------------------------求和---------------------




template<int N>
class Sum
{
public:
enum//用枚举类型,因为用变量,它不会去在编译期推导值的(C++类成员变量初始化不能放在类定义中)
{
value = N + Sum<N - 1>::value
};
};


//需要特化0, 特化到哪里,定义就停在哪里,  如果特化到-1, 则结果到-1
template<>
class Sum<0>
{
public:
enum
{
value = 0
};
};




//-------------------------------二进制转十进制-------------------------------------------
// 主模板
template<unsigned long N>
struct  BinToDec
{
static    const unsigned   val = BinToDec<N / 10>::val * 2 + N % 10;
};


template<>
struct  BinToDec<0>//特化
{
static    const unsigned   val = 0;
};


//----------------------------------求前两项的和----------------------------------------


// 主模板
template<int N>
struct Fib
{
enum { Result = Fib<N - 1>::Result + Fib<N - 2>::Result };//需要特化2个连续的值
};


// 完全特化版
template <>
struct Fib<1>
{
enum { Result = 1 };
};




// 完全特化版
template <>
struct Fib<0>
{
enum { Result = 0 };
};






int main()
{
int t = 5;
A<int>   a;
a.test(&t);

//---------------------


Sum<300>  s; //300的不能太大,会出错
cout << s.value << endl;
//---------------------

cout << BinToDec<10000>::val << endl;
cout << BinToDec<1000000>::val << endl;


//---------------------


int   fib = Fib<10>::Result;
cout << fib << endl;




};

0 0
原创粉丝点击