泛型编程
编写与类型无关的代码
1
| template <typename / class 泛型参数1, typename / class 泛型参数2 ...... >
|
告诉编译器一个模板,让编译器根据不同的类型利用该模板生成代码
函数模版
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| template <class T> void Swap(T& left, T& right) { T tmp = left; left = right; right = tmp; }
template <class T> T add(T a, T b) { return a + b; }
void test() { int a = 1, b = 10; char c = 'a', d = 'b'; Date d1(2020); Date d2(1010); Swap(a, b); Swap(c, d); Swap (d1, d2); Swap<int>(a, b); add<int>(a, c); add<char>(a, c); }
|
函数模版实例化:用实际参数类型,生成可执行的函数
实际上并没有减少实际的代码量,只是把重复的代码交给机器自动生成
减少开发人员重复的工作量,提高工作效率
模版参数的匹配规则
普通函数与模版函数可以共存;共存时,如果普通函数的参数类型可以完全匹配,则执行普通函数,不进行模版函数的实例化
普通函数与模版函数共存时,普通函数的参数类型不能完全匹配,但是实例化的函数可以完全匹配,则进行实例化
普通函数与模版函数共存时,指定了需要实例化(Add<int>(a, b);
),则进行实例化
类模版
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| template <class T1, class T2, class T3> class Date { public: Date(T1 year, T2 month, T3 day) : _year(year) , _month(month) , _day(day) {} void Display(); private: T1 _year; T2 _month; T3 _day; }
template <class T1, class T2, class T3> void Date<T1, T2, T3>::Display() { cout << _year << "-" << _month << "-" << _day << endl; }
void test() { Date<int, int, int> d(2000, 1, 1); d.Display(); }
|
类模版只能显示实例化,不能进行隐式实例化
如果在类外定义类模版的成员函数,需要加上泛型的声明
作用域为 “类名\<泛型参数>”