泛型
泛型(Generic Programming)即是指具有在多种数据类型上皆可操作的含意。泛型编程
的代表作品 STL 是一种高效、泛型、可交互操作的软件组件。
泛型编程最初诞生于 C++中,目的是为了实现 C++的 STL(标准模板库)。其语言支
持机制就是模板(Templates)。模板的精神其实很简单:参数化类型。换句话说,把一
个原本特定于某个类型的算法或类当中的类型信息抽掉,抽出来做成模板参数 T。
函数模板泛型
函数模板只适用于函数模板,只适用于函数的参数个数相同而类型不同,且函数体相同的情况。如果个数不同,则不能用函数模板
#include <iostream>
//函数模板只适用于函数模板,只适用于函数的参数个数相同而类型不同,且函数体相同的情况。如果个数不同,则不能用函数模板
using namespace std;
template<typename T>
void Swap(T &a,T &b)
{
T t=a;
a=b;
b=t;
}
int main()
{
int a= 3;
int b=4;
Swap(a,b);
double f=4.5;
double d=6.5;
Swap(f,d);
cout<<f<<endl;
cout<<d<<endl;
cout << a << endl;
cout << b << endl;
return 0;
}
从代码中可以看出,泛型解决了多种数据类型调用同一方法的问题,类似于函数的重载,也可以理解为函数的重载。
类泛型模板
定义
template<typename T>
class Stack
{ }
类内定义成员函数
template<typename T>
class Stack
{
public:
Stack(int size)
{
space = new T[size];
top = 0;
}
类外定义成员函数
template<typename T>
void Stack<T>::push(T data)
{
space[top++] = data;
}
完整实例
#include <iostream>
using namespace std;
//类模板是类的抽象,类是类模板的实例
template<typename T>
class Stack
{
public:
Stack(int size =512){
top=0;
space=new T[size];
_size=size;
}
~Stack(){
delete []space;
}
void push(T ch);
T pop()//类内定义
{
return space[--top];
}
bool isEmpty()
{
return top==0;
}
bool isFull()
{
return top==_size;
}
private:
T *space;
int top;
int _size;
};
template<typename T>//类外定义
void Stack<T>::push(T ch)
{
space[top++]=ch;
}
int main()
{
Stack<double> s(1024);//实例化的时候注意格式,类似vector<int>这种语法格式
if(!s.isFull())
s.push(1.0);
if(!s.isFull())
s.push(2.3);
if(!s.isFull())
s.push(4.5);
if(!s.isFull())
s.push(3.2);
while (!s.isEmpty()) {
cout<<s.pop()<<endl;
}
}
小结
泛型编程可以较好的适应函数的拓展,可以理解为是一种函数的重载方法,但是它也不是万能的,在使用的过程中会有很多的问题,所以建议首先利用传统的方法实现,然后再改成模板类。