C++模板的特化(函数模板特化,类模板特化)与实例化区别联系
2018-03-09 14:41
441 查看
一:实例化什么是实例化:一个通过使用具体值替换模板参数,从模板产生的普通类,函数的过程
1.显示实例化:通过指定的类型,表明要实例化的类型
2.隐式实例化:通过编译器自己推演,判断出要实例化的类型
二 :特化=具体化类模板特化类模板
类模板全特化
类模板偏特化 //局部特化情况一:局部特化第二个参数
情况二:局部特化两个参数为指针类型
4000
从情况二可看出,1.偏特化不仅仅是指特殊部分参数,2.而且针对模板参数更进一步的条件限制,设计出来的一个特化版本函数模板特化函数模板全特化注意:显示实例化只有声明,无定义,而特化有定义。
函数模板偏特化函数模板没有偏特化,可以通过函数重载实现
1.显示实例化:通过指定的类型,表明要实例化的类型
2.隐式实例化:通过编译器自己推演,判断出要实例化的类型
二 :特化=具体化类模板特化类模板
template<class T1,class T2> class Date { public:Date() { cout << "Date(T1,T2)" << endl; } private: T1 _a; T2 _b; }; template<class T1, class T2> class Date { public:Date(); private: T1 _a; T2 _b; }; template<class T1,class T2> Date<T1, T2>::Date() { cout << "Date(T1,T2)" << endl; }
类模板全特化
template<class T1,class T2>//模板 class Date { public:Date() { cout << "Date(T1,T2)" << endl; } private: T1 _a; T2 _b; }; template<>//全特化 class Date<int, char> { public:Date(); private: int _a; char _b; }; //全特化在类外定义成员函数 ---------不再需要模板形参 Date<int,char>::Date() { cout << "Date(int,char)" << endl; } int main() { Date<int,char> d3; system("pause"); return 0; }
类模板偏特化 //局部特化情况一:局部特化第二个参数
template<class T1, class T2> class Date { public:Date() { cout << "Date(T1,T2)" << endl; } private: T1 _a; T2 _b; }; template<class T1>//偏特化 class Date<T1, double> { public:Date(); private: T1 _a; double _b; }; template<class T1>//偏特化在类外定义类的成员函数必须加上模板形参 Date<T1, double>::Date() { cout << "Date(T1, double)" << endl; } int main() { Date<int, double> d3; system("pause"); return 0; }
情况二:局部特化两个参数为指针类型
template<class T1, class T2>//模板 class Date { public:Date(); private: T1 _a; T2 _b; }; template<class T1, class T2>//偏特化两个参数为指针类型 class Date<T1*, T2*> { public:Date(); private: T1 a; T2 b; T1* _a; T2* _b; }; template<class T1, class T2>//偏特化在类外定义类的成员函数必须加上模板形参 Date<T1*, T2*>::Date() { cout << "Date(T1*,T2*)" << endl; } int main() { Date<int*, int*> d3; system("pause"); return 0; }由上面例子可得到:模板全特化和偏特化都是在已定义模板的基础上,不能单独存在。
4000
从情况二可看出,1.偏特化不仅仅是指特殊部分参数,2.而且针对模板参数更进一步的条件限制,设计出来的一个特化版本函数模板特化函数模板全特化注意:显示实例化只有声明,无定义,而特化有定义。
//===============================对于函数模板===============================================// #define Max 125 struct work { char name[Max]; int money; }; template<class T> void Swap(T& a, T& b) { T tmp = a; a = b; b = tmp; } template void Swap<int>(int& a, int& b);//显示实例化 无需给该函数重新编写函数体,这只是个声明 template <> void Swap<work>(work& a, work& b)//特化 注意与实例化区分开,必须有定义 { int money = a.money; a.money = b.money; b.money = money; }
函数模板偏特化函数模板没有偏特化,可以通过函数重载实现
相关文章推荐
- JAVA的泛型和C++的模板的区别与联系
- JAVA的泛型和C++的模板的区别与联系
- C++中STL的string类模板与MFC中Cstring类区别与联系
- C++中数组名和指针的区别联系
- C++、VC++和MFC的区别与联系
- C++ 函数模板 实例化和具体化
- 【C++模板】特化与偏特化 template [partial] specialization
- C++ 标准头文件与C头文件区别与联系以及C风格字符串
- C++头文件中<>与""的区别,实例化类的两种方法
- C++中指针(pointer)和引用(reference)的区别和联系
- C++和C的联系与区别
- C++—模板(2)类模板与其特化
- 用汇编的眼光看C++(之缺省模板、特化模板)
- GNU C 、ANSI C、标准C、标准c++区别和联系
- C++深拷贝与浅拷贝的区别联系
- 从零开始学C++之模板(一):函数模板、函数模板特化、重载函数模板、非模板函数重载
- C++中引用与指针的区别与联系
- C++暂停黑窗口 system( “pause “);(getch(),getchar(),system(pause)的联系和区别!!!)
- C++的template模板中class与typename关键字的区别分析
- C++ 模板和 C# 泛型之间的区别