C++模板

1.泛型编程
泛型编程指的是编写与类型无关的代码,让系统或者编译器自己根据不同的类型去生成相应的代码. 我们把这一类编程叫做泛型编程.

对于实现一个交换函数我们都是通过类似于如下的代码去实现的. 但是下面的代码只能实现 int 类型的变量的交换. 对于 double型的变量来说, 就只能重新去写一个交换函数.

int Swap(int & a,int & b){
int tem=*a;
*a=*b;
*b=tem;
}

因此, 我们用反省编程去实现交换函数,即一个模板函数 代码如下:

template<typename T>
void swap(T& a,T& b){
 T tem = a;
 a = b;
 b = tem;
}

2.模板函数
template<typename T1,typename T2> 这是模板函数的格式, typename是用来定义模板参数的关键字(也可用使用class)
原理: 模板函数的原理是当调用这个函数的时候,编译器自己会根据填入参数的类型,然后去生成一个函数,加入此时需要交换的参数是 int 型的,则编译器会自己生成参数为 int 型的函数C++模板
特点:
1.

int  main(){
int a=1;
double b=2.3;
swap(a,b)
}

当像上述代码一样对函数传入的参数是两个不同的类型的时候, 此时的表编译器是编译不通过的. 需要对其中的一个参数进行强制类型转换. 或者在函数的后面加上最终需要获的类型,并用<>括起来.

//输出为int型
swap(a,(int)b);
swap<int>(a,b);
//输出为double型
swap((double)a,b)
swap<double>(a,b);

除此之外,还可以定义多个模板参数的模板函数

template<typename T1,typename T2>
T swap(T1 &a,T2 &b){
T1 tem=*a;
*a=*b;
*b=tem;
}

这样也可以实现不同参数的使用
2.
当模板函数与非模板函数共存的时候, 使用该函数的话,会调用非模板函数,但如果指定类型的话,就必须以模板函数生成相应的函数.

3.类模板
泛型编程的另外一个例子就是类模板
类模板的定义如下

template<class T>
class 类模板名{
      //类内成员 
}

下面是日期类的定义

template<class T>
class Date{
pubilc:
  Date(T year = 1998 ,T month = 12 ,T day = 6)
:_year(year)
,_month(month)
,_day(day)
 {}
private:
  T  _year;
  T  _month;
  T  _day;
}
int main(){
date<int> d;
}

在使用类模板的时候, 必须进行显示实例化(即给出要定义的类型)

C++模板