c++ 函数模板

c++的函数模板提供了一种泛型的方法去实现某些设计,模板顾名思义,只是提供一种实现的模板,函数模板不是实际的函数,而是编译器用于生成一个或多个函数的 "模具"。在编写函数模板时,不必为形参、返回值或局部变量指定实际类型,而是使用类型形参来指定通用数据类型。当编译器遇到对函数的调用时,它将检查其实参的数据类型,并生成将与这些数据类型配合使用的函数代码。

  • 函数模板的定义
//形如template <class T,class T1,...>返回值 函数名(参数1,参数2,...)
//eg
template <class T,class T1,...>
T my_fun(T a,T1 b,..)
{

}

通过函数模板,可以看到形参的类型不是确定的,<>中的class表示其后的参数可以是任意类型。 模板参数常称为类型参数或类属参数,在模板实例化(即调用模板函数时)时需要传递的实参是一种数据类型,如int或double之类。不要把这里的class与类的声明关键字class混淆在一起,虽然它们由相同的字母组成,但含义是不同的。这里的class表示T是一个类型参数,可以是任何数据类型,如int、float、char等,或者用户定义的struct、enum或class等自定义数据类型。为了区别类与模板参数中的类型关键字class,标准C++提出?了用typename作为模板参数的类型关键字,同时也支持使用class。

//形如template <typename T,typename T1,...>返回值 函数名(参数表)
//eg
template <typename T,typename T1,...>
T my_fun(T a,T1 b,..)
{

}
函数模板可以有多个类型参数,但每个类型参数都必须用关键字class或typename限定。此外,模板参数中还可以出现确定类型参数,称为非类型参数。例:
```c
template <class T1,class T2,class T3,int T4>
T1 fx(T1 a, T 2 b, T3 c){…}
  • 函数模板的实例化
    实例化发生的时机 模板实例化发生在调用模板函数时。当编译器遇到程序中对函数模板的调用时,它才会根据调用语句中实参的具体类型,确定模板参数的数据类型,并用此类型替换函数模板中的模板参数,生成能够处理该类型的函数代码,即模板函数,当多次发生类型相同的参数调用时,只在第1次进行实例化。

实例化的方式,可以隐式的实例化,也可以显式的实例化

//当编译器能够推断出参数的类型时,可以隐式的实例化,当然也可以显式
template <typename T> T Max (T, T);
…
int i = Max (1, 2); 
int i = Max <int>(1, 2); 
float f = Max (1.0, 2.0);
char ch = Max (‘a’, ‘A’);
…
//当编译器不能推断出,必须显式的实例化
template <class T> T max (T, T);
…
int i = max (1, ‘2’); 
// error: data type can’t be deduced
int i = max<int> (1, ‘2’);
…
  • 函数模板的特化
    特化的原因 但在某些情况下,模板描述的通用算法不适合特定的场合(数据类型等) 比如:如max函数
//定义一个Max的模板,实例化如下
char * cp = Max (“abcd”, “1234”);
实例化为:char * Max (char * a, char * b){return a > b ? a : b;}
//但这显然不是我们想要的,以为字符串的比较应该如下
char * max (char * a, char * b)
{	return strcmp(a, b)>0 ? a : b;   }

特化 所谓特化,就是针对模板不能处理的特殊数据类型,编写与模板同名的特殊函数专门处理这些数据类型。 模板特化的定义形式: template <> 返回类型 函数名<特化的数据类型>(参数表) { …… }

下面是一个特化的例子

template <class T>
T Max(T a,T b) {
    return (a>b)?a:b;
}
//特化
//template <> 返回类型 函数名<特化的数据类型>(参数表) {}
template<>char * Max<char *>(char *a,char *b) {
    return (strcmp(a,b)>=0)?a:b;
}

函数模板是一个模板,可以用来实例化一系列的函数,实例化的函数成为模板函数

posted @ 2020-08-04 14:08  tccxy  阅读(238)  评论(0编辑  收藏  举报