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,..)
{

}

* 函数模板的实例化
实例化发生的时机 模板实例化发生在调用模板函数时。当编译器遇到程序中对函数模板的调用时,它才会根据调用语句中实参的具体类型,确定模板参数的数据类型,并用此类型替换函数模板中的模板参数,生成能够处理该类型的函数代码,即模板函数,当多次发生类型相同的参数调用时,只在第1次进行实例化。

实例化的方式,可以隐式的实例化,也可以显式的实例化
```c
//当编译器能够推断出参数的类型时,可以隐式的实例化,当然也可以显式
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;
}

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

c++ 函数模板

原文:https://www.cnblogs.com/tccxy/p/13432909.html

hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » c++ 函数模板