一、模板函数(compare)
1、一般模板函数
数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函数的函数体重复设计。函数模板的定义形式是:
template <模板参数表>
类型名 函数名 (参数表)
{
函数体的定义
}
?所有函数模板的定义都用关键字 template 开始,其中<>中可以包括以下内容:
(1)class 或 typename 标识符,指明可以接受一个类型参数。
(2)类型说明符 标识符,指明可以接受一个由“类型说明符”所规定类型的常量作为参数。
(3)template<参数表>class 标识符,指明可以接收一个类模板名作为参数。
以下为一个判断相等的函数模板:?
template<class T>
bool Isequal(T& p1, T& p2){
return p1 == p2;
}
2、特化模板函数
使用模板时会遇到一些特殊的类型需要特殊处理,不能直接使用当前的模板函数,所以此时我们就需要对该类型特化出一个模板函数。
比如上面那个判断相等的模板函数在对于字符串进行比较时就不能使用了,对于字符串我们不能直接比较,因此直接特化出一个专门供字符串使用的模板参数。
template<> // 此处不添加类型模板,直接使用空即可
bool Isequal<char*>(char*& p1, char*& p2){
return strcmp(p1, p2) == 0;
}
?【注意】
-
使用模板特化时,必须要先有基础的模板函数。(就是上面第一个模板函数) -
使用特换模板函数时格式有要求: 1.template 后直接跟<> 里面不用写类型。 2.函数名<特化类型>(特化类型 参数1, 特化类型 参数2 , …) 在函数名后跟<>其中写要特化的类型。 -
特化的函数的函数名,参数列表要和原基础的模板函数想相同,避免不必要的错误。
二、模板类Queue或Stack
1、模板类(Queue,Stack)
使用类模板使用户可以为类定义一种模式,使得类中的某些数据成员、某些成员函数的参数、返回值或局部变量能取不同类型。(包括系统预定义的和用户自定义的)
类模板的定义形式是:
template <模板参数表>
class 类名
{
类成员声明
}
1.1 Queue?
Queue<T> 是一种只能访问第一个和最后一个元素的容器适配器,只能在容器的末尾添加新元素,只能从头部移除元素。
1、特征:先进先出 。只能操作队头与队尾的元素 。
2、功能:queue.push(elem):把元素压入队列尾部? ????????????????queue.pop():删除队首元素,但不返回 ????????????????queue.front():返回队首元素,但不删除 ????????????????queue.back():返回队尾元素,但不删除 ????????????????queue.size():返回队列中元素的个数 ????????????????queue.empty():检查队列是否为空,如果为空返回true,否则返回false
使用front()和pop()函数前,必须用empty()判断队列是否为空。
1.2 Stack
Stack<T> 容器适配器中的数据是先进后出的,当想访问栈内某一元素时,必须将其顶部的元素都弹出出栈后,才能访问该元素。
1、特征:先进后出 。只能插入,删除,访问栈顶的元素。
2、功能:stack.push(elem):往栈头添加元素 ????????????????stack.pop():从栈头移除第一个元素 ????????????????stack.top():返回栈顶元素 ????????????????stack.empty():判断堆栈是否为空,栈空返回true,栈非空返回false ????????????????stack.size():返回堆栈的大小
2、成员模板函数
类成员声明的方法与普通类的定义几乎相同,只是在它的各个成员(数据成员和函数成员)中通常要用到模板的类型T。
成员函数的定义形式是:
template <模板参数表>
类型名 类名 <模板参数标识符列表>::函数名(参数表)
3、模板特化:模板成员函数特化、模板类特化
三、模板类AutoPtr 构造函数 析构函数 拷贝构造函数 等号、->、*等运算符重载 主函数调用AutoPtr
|