0%

初识模板

泛型编程

编写与类型无关的代码

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();
}

类模版只能显示实例化,不能进行隐式实例化

  • 类型和类名不同;类型:类名\<模版实际参数类型>

如果在类外定义类模版的成员函数,需要加上泛型的声明

作用域为 “类名\<泛型参数>”

-------------本文结束感谢您的阅读-------------