函数模板
格式
T
代表一种类型据模板和参数类型编译器自动生成函数,即模板实例化
不通过参数也可实例化函数模板
template <class T> //class 可替换为 typename,相同的意思 T increase(T n) { return n + 1; } int main() { cout << increase<double>(4) / 2; //输出 2.5 return 0; }
函数模板可以有不止一个类型参数
函数模板可以重载,形参或类型参数不一致即可
匹配模板函数时,不进行类型自动转换
函数模板和函数的选择次序
类模板
template <class T> class className { private: T key; public: className(T k):key(k) {}; bool func(T& k); } template <class T> bool className<T>::func(T& k) { return k; }
类模板里的成员函数(类外定义时)
template <class T1, class T2 ...> 返回值类型 类模板名<类型参数名表>::成员函数名(参数表) { ..... }
实例化——类模板生成类的过程
类模板名<真实类型参数表> 对象名(构造函数实参表)
className<int> value(5);
由类模板实例化而来的类叫模板类
函数模板可以是类模板成员(成员函数模板)
类模板的类型参数表中可以有非类型参数
template <class T, int size>
与类模板相关的
类模板从类模板派生时,需初始化基类类型
template <class T1, class T2> class A { T1 key; T2 value; } template <class T1, class T2> class B:public A<T2, T1> { T1 answer; T2 static; } template <class T> class C:public A<T, T> { T lock; }
函数、类、类的成员函数均可作为类模板的友元
函数模板、类模板均可作为类模板的友元
template <class T> friend ...
类模板中定义的静态变量成员不被模板类共享,每个静态成员均需在外部声明
template <class T> class A { private: static int count; } template<> int A<double>::count = 0; template<> int A<int>::count = 0; //两个模板类的声明