因为C++模板中有很多概念,总是容易忘记,所以学习了之后,特地总结一下,方便下次复习。
1、类模板和模板类的区别
类模板是一个关于类的模板
模板类是类模板实例化后的实体。
2、特化是针对模板参数更进一步的条件限制所设计出来的特化版本。
模板全特化和偏特化,全特化是把所有模板形参进行限制。 偏特化是把部分形参进行限制。
模板特化和偏特化后,还是一个类模板。
//Grap 为形参 template<typename Grap> class Calculate { public: int GetGirth(const Grap& grap); //获取周长 }; template<typename Grap> int Calculate<Grap>::GetGirth(const Grap& grap) { int iGirth = 0; for (int i = 0; i < grap.GetEdgeCount(); ++i) { iGirth += grap.GetEdgeLength(i); } return iGirth; } class Circle { public: int iR; }; //特化,其中 Circle为实参 template<> class Calculate<Circle> { public: int GetGirth(const Circle& grap); //获取周长 }; //template<> 注意:不需要写这一行 int Calculate<Circle>::GetGirth(const Circle& grap) { return 2 * grap.iR * 3.14; }
3、模板实例化
一个通过具体值替换模板参数,从模板产生普通类、函数或者或者成员函数的过程。
4、类模板和函数模板的区别
a) 类模板没有自动类型推导的使用方式。
b)类模板在模板参数列表中可以有默认参数,既可以缺省。
c)对函数模板,只能全特化,不能偏特化。
5、函数模板不能自动类型转换。
void max(T a, T b);
调用 max('a',42.6) 编译错误。
6、函数重载可以完成代替函数偏特化
#pragma once template<typename T1,typename T2> void func(T1 t1, T2 t2) { } #if 0 /* 不能偏特化 */ template<typename T2> void func<int,T2>(int t1, T2 t2) { } #endif //可以通过重载实现偏特化的效果 template<typename T2> void func(int t1, T2 t2) { }
7、类模板偏特化
#pragma once template<typename T1,typename T2> class D { }; template<typename T1> class D<T1,int> { };
8、类模板的显式实例化,在未调用的时候就已经实例化了。
template<typename T> class E { }; //类的显示实例化 template class E<int>;
9、函数模板的显式实例化
template<typename T> void Fun(T t) { } //函数的显式实例化 template void Fun<int>(int);