// 模板 (template): 泛型编程,类型占位符
// 1. 函数模板
// 2. 类模板
// 函数模板: 函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数话根据实参类型产生函数的特定类型版本!
// 函数模板格式:
// template<typename T1,template T2 template T3 ... template Tn>
// 返回值类型 函数名 (参数列表) {}
template <typename T>
void swap(T& left, T& right) {
T tmp = left;
left = right;
right = left;
}
// 注: typename 是用来定义模板参数的关键字,也可以使用class但是不能用struct代替class
// 在编译阶段,对于模板函数的使用,编译器需要根据传入实参类型来推演生成对应类型的函数以供调用;
// 函数模板的实例化
// 1. 隐式实例话
template<class T>
T add(const T& a, const T& b) {
return a + b;
}
#if 0
int main() {
int a1 = 10, a2 = 20;
double d1 = 10.0, d2 = 20.0;
add(a1, a2);
add(d1, d2);
add(a1, (int)d1);
return 0;
}
#endif
//2. 显示实例化
#if 0
int main() {
int a = 10;
double d = 10.0l;
add<int>(a, d);
return 0;
}
#endif
// 一个非模板函数可以和一个同名的模板函数同时存在,而且模板函数还可以被实例化成为这个非模板函数!
// 对于非模板函数和同名的模板函数,如果其他条件都相同,在调用时会优先调用非模板函数而不会从该模板产生一个实例.
// 如果模板可以产生一个具有更好匹配的函数,那么将选择模板!
// 类模板:
// template <class T1,class T2 ... class Tn>
// class 类模板名{};
template<class T>
class Vector {
public:
Vector(size_t capacity = 10):_pData(nullptr),_size(0),_capacity(capacity){}
~Vector();
private:
T* _pData;
size_t _size;
size_t _capacity;
};
// 注意: 类模板中函数放在类外进行定义时,需要加模板参数列表!
template<class T>
Vector<T>::~Vector() {
if (_pData) delete[] _pData;
_size = 0;
_capacity = 0;
}
// 类模板的实例化!
// 类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后面跟<>,将实例化的类型放入<>中,
// 类模板名字不是真正的类,实例话的结果才是真正的类!
09-10
891
09-11
264
09-11
559
09-11
1025