C++模板

泛型编程

编写与类型无关的通用代码。

template <typename / class 泛型参数1, typename / class 泛型参数2 ...... >

告诉编译器一个模板,让编译器根据不同的类型利用该模板生成代码

模板实例化:用实际参数类型,生成可执行的函数。

泛型编程并没有减少实际的代码量,只是把重复的代码交给机器自动生成。
减少开发人员的重复工作量,提高工作效率,增加幸福感。

函数模版

template <class T>
void Swap(T& left, T& right)
{
  T tmp = left;
  left = right;
  right = tmp;
}

template <class T>
T add(T a, T b)
{
  return a + b;
}

void test()
{
  int a = 1, b = 10;
  char c = 'a', d = 'b';
  Date d1(2020);
  Date d2(1010);
  
  //隐式实例化:编译器根据参数进行自动推导,产生直接可执行的代码
  Swap(a, b);
  Swap(c, d);
  Swap (d1, d2);
  
  //显示实例化:函数名 + <类型> + (参数列表)
  Swap<int>(a, b);
  add<int>(a, c);
  add<char>(a, c);
}

实例化:

  1. 隐式实例化:编译器根据参数自动推演类型,产生可直接执行的代码。
  2. 显式实例化:函数名+<类型>+<参数列表>。

模版参数的匹配规则

  • 普通函数与模板函数共存时,如果普通函数的参数类型可以完全匹配。则执行普通函数,不进行模板函数的实例化。(直接吃现成的饭)
  • 普通函数与模板函数共存时,普通函数的参数类型不能完全匹配。但是实例化的函数可以完全匹配参数类型,则进行实例化。(饭不好吃,重新做)
  • 普通函数与模板函数共存时,但是指定了需要实例化(Add(a, b);),则进行实例化。

类模版

template <class T1, class T2, class T3>
class Date
{
public:
  Date(T1 year, T2 month, T3 day)
    : _year(year)
    , _month(month)
    , _day(day)
    {}
  void Display();
private:
  T1 _year;
  T2 _month;
  T3 _day;
}

template <class T1, class T2, class T3>
void Date<T1, T2, T3>::Display()
{
  cout << _year << "-" << _month << "-" << _day << endl;
}

void test()
{
  Date<int, int, int> d(2000, 1, 1);
  d.Display();
}

类模板只能显示实例化,不行进行隐式实例化。

类型和类名不同

类型:类名<模板实际参数类型>

如果在类外定义类模板的成员函数,需要加上泛型的声明。

作用域为“类名<泛型参数>”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值