[小记]模板的泛化,全特化和偏特化

论坛 期权论坛 脚本     
匿名技术用户   2021-1-17 10:54   2031   0

1)模板类的特化


//1)类的特化

//泛化
template<class T, class K>
struct My
{
 My(){cout<<"General Version\n";}
 void test();
};

template<class T,class K>    //泛化必须带所有泛化的参数
void My<T,K>::test()
{
 cout<<"General Version: Test()\n";
}

//完全特化
template<>               //类的完全特化,所有泛化参数均为指定数据类型,必须有template<>在class前,<>内为空,表示为完全特化
struct My<int, double>
{
 My(){cout<<"Total Special Version\n";}
 void test();
};

//template<>            //注意这里对于完全特化的成员函数,不需要template<>了,直接有下面的函数即可
void My<int,double>::test()
{
 cout<<"Total Special Version: Test()\n";
}

//偏特化              
template<class T>      //仅仅保留部分泛化参数,其他部分参数为特别指定的参数
struct My<T,double>
{
 My(){cout<<"Partial Special Version\n";}
 void test();
};

template<class T>     //成员函数需要带template<泛化的参数>
void My<T,double>::test()
{
 cout<<"Partial Special Version: Test()\n";
}

int main(int argc, _TCHAR* argv[])
{

 My<short,int> a;
 My<short,double> b;
 My<int,double> c;

 a.test();
 b.test();
 c.test();
 return 0;
}

最后输出结果

General Version
Partial Special Version
Total Special Version
General Version: Test()
Partial Special Version: Test()
Total Special Version: Test()


2)模板类成员的特化

template<class T, class K>
struct Me
{
 void We();
};

template<class T,class K>    //泛化版本
void Me<T,K>::We(){cout<<"Member: General Version\n";}

//成员函数不能偏特化
//严格的来说,函数模板并不支持偏特化,但由于可以对函数进行重载,所以可以达到类似于类模板偏特化的效果
//这样就需要利用参数个数,参数顺序,const属性来进行重载了
//template<class T> //错误
//void Me<T,double>::We(){cout<<"Member: Partial Special Version\n";}

//完全特化
template<>
void Me<int,double>::We(){cout<<"Member: Total Special Version\n";}


int main(int argc, _TCHAR* argv[])
{
Me<short,int> e;
 Me<short,double> f;
 Me<int,double> g;

 e.We();
 f.We();
 g.We();

 return 0;
}

结果:

Member: General Version
Member: General Version
Member: Total Special Version



分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP