生活随笔
收集整理的這篇文章主要介紹了
模板-1-模板类的特化
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2019獨角獸企業重金招聘Python工程師標準>>>
類模板的特化
template<>
class????類名<特化類的模板實參表>{/*?特化類的定義?*/
};
template<typename?Type1,typename?Type2>
class???X{
public:void????print(){?Println("模板類:?Type1:?%s\tType2:?%s",getTypeName(Type1),getTypeName(Type2));?}
};template<>
class???X<int,double>{
public:void????print();void????test(){}
};/*?不要添加'template<>'標記?*/
void????X<int,double>::print(){?Println("特化類:?Type1:?int\tType2:?double");?}int?main(int?argc,char?*argv[]){X<double,double>????dd;dd.print();
//??dd.test();??/*?錯誤!X<double,double>不存在test()成員函數.?*/X<int,double>???????id;id.print();id.test();??/*?只要X<int,double>中才存在test()成員函數?*/
}
特化成員而不特化類
/*?TestTem.h?---?模板類及其布特化成員的聲明?*/
#define?????getTypeName(type)???????typeid(type).name()
#define?????PrintType(type)?Println(#type?":?%s",getTypeName(type));template<typename?Type1>
struct?TestTem?{template<typename?Type2>void????func2();void????func1();
};/*?成員func1的特化聲明.此時func1是一個實實在在的函數?*/
template<>
void????TestTem<float>::func1();/*?模板成員func2的特化聲明,此時僅特化了一部分.所以特化后的func2仍是模板.?*/
template<>?template<typename?Type2>
void????TestTem<float>::func2();/*?模板成員?func2?的特化聲明,此時進行了全部特化,func2也是一個實實在在的函數.?*/
template<>?template<>
void????TestTem<float>::func2<double>();/*?---?TestTem成員定義?----?*/
template<typename?Type1>
void????TestTem<Type1>::func1(){Println("模板:?%s",getTypeName(Type1));
}
template<typename?Type1>?template<typename?Type2>
void????TestTem<Type1>::func2(){Println("模板:?%s\t%s",getTypeName(Type1),getTypeName(Type2));
}/*?---?特化函數func2的定義?---?*/
template<>?template<typename?Type2>
void????TestTem<float>::func2(){?Println("1特化:?double\t%s",getTypeName(Type2));?}/*?TestTem.cc?---?特化成員的定義?*/
/*?成員func1的特化聲明.此時func1是一個實實在在的函數?*/
template<>
void TestTem<float>::func1(){?Println("特化:?int");?}/*?模板成員?func2?的特化聲明,此時進行了全部特化,func2也是一個實實在在的函數.?*/
template<>?template<>
void TestTem<float>::func2<double>(){?Println("2特化:?float\tdouble");?}
類模板的部分特化
#define TypeName(type) typeid(type).name()
#define? PrintType(type)?Println(#type?":?%s",TypeName(type));template<typename?Type1,typename?Type2,typename?Type3>
struct X{void print(){?Println("模板:?%s\t%s\t%s",TypeName(Type1),TypeName(Type2),TypeName(Type3));?}
};/*?是其模板類模板形參表的子集?*/
template<typename?Type2>
struct X<int,Type2,double>{/*?此時?Type1=int,Type3=double?*/void print(){?Println("特化:?i\t%s\td",TypeName(Type2));?}
};X<double,double,double>????x;????/*?使用模板類,此時?Type1=Type2=Type3=double?*/
X<int,double,double>????x1????/*?使用部分特化類,此時?Type1=int,Type2=double,Type3=double?*/
轉載于:https://my.oschina.net/u/1383479/blog/221453
總結
以上是生活随笔為你收集整理的模板-1-模板类的特化的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。