模板是C++中一个重要的部分,也是泛型编程的基础,一个模板就是一个创建类或函数的蓝图,使用它在很多时候都能给我们带来巨大的便利。
一、函数模板
定义一个函数模板的语法为:
1 2 3 4 5 6 7 |
template <typename T> int compare(const T &v1, const T &v2) { if (v1 < v2) return -1; else if (v1 > v2) return 1; else return 0; } |
模板以关键字template
开始,后面跟一个模板参数列表,和函数的形参一样,参数列表可以是多个以逗号隔开的一个或多个参数,外部用<>
包起来。
T
代表一种数据类型,可以为任意的内置类型或自定义类,只要该类型实现了函数重载,就可以通过compare()
函数进行比较。
例如:
1 2 3 |
vector<int> v1{1, 2, 3}, v2{1, 2, 3}; cout << compare(1, 2) << endl; cout << compare(v1, v2) << endl; |
执行后输出:
1 2 |
-1 0 |
二、模板实例化
当我们调用一个函数模板时,编译器会根据我们的形参类型创建一个特定类型的函数,这个过程就叫模板实例化。例如使用两个int
类型的变量进行比较,编译器就会对上面的模板创建一个int
对象的新实例:
1 |
compare(const int&, const int &b); |
使用vector
则创建一个 compare(const vector<int>&, const vector<int>&)
实例。
三、模板类型参数
在compare
函数中使用了T
类型,在模板函数中T
被称为类型参数,一般情况下,我们可以直接把T
当作一种普通的数据类型。可以对T
在内部进行运算、类型转换以及作为函数参数返回。
1 2 3 4 5 6 7 |
template <typename T> T foo(T* p) { T tmp = *p; // ... return tmp; } |
四、typename和class
在模板函数声明中,typename
和class
两个关键字的含义相同,可以互换使用。
1 2 |
template <typename T, class U> add (const T&, const U&); |
相比之下,typename
是模板在广泛使用之后才引入C++
的,算是两者之间地一个小区别。
评论