一、函数模板
1.1 概念
函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。
格式: template <typename T>
或template <class T>
template <class T> void Swap(T& a, T& b) { T tmp = a; a = b; b = tmp; } int main() { int a = 1, b = 2; double d1 = 1.2, d2 = 2.1; Swap(a, b); Swap(d1, d2); return 0; }
1.2 函数模板的原理
在编译阶段,编译器需要根据传入实参的类型推演生成对应类型的函数。
1.3 函数模板的实例化
用不同类型的参数使用函数模板时,称为函数模板的实例化。
1. 隐式实例化:编译器根据传入实参的类型推演生成对应类型的函数
如上:Swap()
。
template <class T> T Add(const T x, const T y) { return x + y; } int main() { int a1 = 1; double d1 = 2.0; // error // Add(a1, d1); // 1. Add(a1, (int)d1); 2. 显式实例化 return 0; }
2. 显式实例化:在函数名后的<>
中指定函数模板的参数类型
template <class T> T Add(const T x, const T y) { return x + y; } int main() { int a1 = 1; double d1 = 2.0; Add <double>(a1, d1);// 显式实例化 return 0; }
二、类模板
2.1 类模板格式
template <class T1, class T2, ..., class Tn> class 类模板名 { // 类成员定义 };
E.g.
template <class T1> // typedef int STDateType class Stack// Stack不是具体的类,是编译器根据被实例化的类型生成的具体类的模具 { public: Stack(int capacity = 3) :_top(0) , _capacity(capacity) { cout << "Stack(int capacity = 3)" << endl; // _a = new STDateType[capacity]; _a = new T1[capacity]; } ~Stack() { cout << "~Stack()" << endl; delete _a; _top = _capacity = 0; } private: // STDateType* _a; T1* _a; int _top; int _capacity; };