C++函数模板和类模板Template

泛型

泛型(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;
    }
}

小结

泛型编程可以较好的适应函数的拓展,可以理解为是一种函数的重载方法,但是它也不是万能的,在使用的过程中会有很多的问题,所以建议首先利用传统的方法实现,然后再改成模板类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值