模板初阶:函数模板和类模板
1.函数模板
格式
template<typename/class T1,typename/class T2,typename/class T3.........typename/class Tn>
#include <iostream>
using namespace std;
template<class T>
T Add(const T& left,const T& right) {
return left + right;
}
template<class T>
void Swap(const T& left, const T& right) {
T tmp = left;
left = right;
right = tmp;
}
void test1() {
int a = 1, b = 2;
double c = 1.0, d = 2.0;
//隐式实例化:让编译器根据实参的类型推演模板参数的实际类型
Swap(a, b);
Swap(c, d);
//cout << Add(a, b) << endl;
//cout << Add(c, d) << endl;
//强制转化类型的方式是不推荐的
//Add(a, (int)c);//这块如果给参数进行强转的时候调用的函数必须写成const类型,(int)c)之后系统会自动产生一个临时变量(不会发生改变的)
显示实例化:函数<实例化类型>(参数列表)
//Add<int>(a, d);
}
int main () {
test1();
system("color A");
system ("pause");
return 0;
}
函数模板匹配原则:
1.当普通函数和模板函数共存时,如果普通函数的参数类型可以完全匹配,则执行普通函数,不执行模板函数的实例化.
2.与普通函数不完全匹配,但是与实例化模版完全匹配参数类型,则走模板的实例化
3.假如直接有类型实例化的(Add(a,b))式子,那么一定走的是模板的实例化表达式.
2.类模板的定义格式
格式
template<class T1,class T2,class T3....class Tn>
class 类模板名 {
};
#include <iostream>
using namespace std;
template<class T>
struct seqlist{
public:
seqlist(size_t num=10)
:_arr(new T[num])
, _size(0)
, _capacity(num)
{}
void push_back(T x) {
_arr[_size++] = x;
}
T* _arr;
size_t _size;
size_t _capacity;
};
void test1() {
类型: 类名<模板实际参数类型>
seqlist<int> sq1;
seqlist<char> sq2;
seqlist<double> sq3;
cout << sizeof(sq1) << endl;
cout << sizeof(sq2) << endl;
cout << sizeof(sq3) << endl;
sq1.push_back(1);
sq1.push_back(2);
sq1.push_back(3);
sq2.push_back('a');
sq2.push_back('b');
sq2.push_back('c');
sq1.push_back(1.0);
sq1.push_back(2.0);
sq1.push_back(3.0);
}
int main () {
test1();
system("color A");
system ("pause");
return 0;
}
类模板的定义: 类内或者类外
如果在类外定义模板的成员函数,需要加上泛型的声明 template<typename T/class T>