函数模板

来源:互联网 发布:手机淘宝6.3.2 旧版本 编辑:程序博客网 时间:2024/06/05 07:37

如果让你实现一个通用的加法函数你会用什么办法呢?这里介绍几种方法:

1、函数重载

#include<iostream>using namespace std;int ADD(const int& left, const int& right){return (left + right);}char ADD(const char& left, const char& right){return (left + right);}double ADD(const double& left, const double& right){return (left + right);}int main(){cout << ADD(1, 2) << endl;cout << ADD('1', '2') << endl;cout << ADD(1.0, 2.0) << endl;system("pause");return 0;}

2、公共基类+虚函数,在这就不具体实现了。

3、函数模板

#include<iostream>using namespace std;template <class T>T ADD(T left, T right){return left + right;}int main(){cout << ADD(1, 2) << endl;cout << ADD('1', '2') << endl;cout << ADD(1.0, 2.0) << endl;system("pause");return 0;}

下面就着重来介绍下函数模板:

一、什么是函数模板

       函数模板可以创建一个通用的函数,支持不同的形参,可以说是代表了一个函数家族,在使用时被实例化,根据实参的类型产生特定类型的版本,它最大的特点就是把函数使用时的数据类型作为参数。ps:上面实现通用的加法函数的第三种方法就是使用的函数模板。

模板函数的一般形式为:

template <typename  Pram1,typename Pram2,......,class  Pram>

返回值类型    函数名(参数列表)

{

}

在这里要为大家介绍一个关键字--------template,typename:

       template是用来定义模板函数的关键字,后面的尖括号不能省略;typename是用来声明数据类型参数标识符的关键字,用以说明它后面的标识符是数据类型的标识符。

注意:1、模板函数它不是函数,它是一个蓝图。编译器用模板产生指定的类或函数的特定版本,此过程称为实例化。如图所示:

          

         2、不能用struct代替typename,但可以用class。

         3、模板函数也可以定义为内敛函数(inline函数),inline关键字必须放在模板形参表之后,返回值之前。

      

       4、类型形参的转换:一般不会转换实参以匹配已有的实例化,相反会产生新的实例。

            (1)const转换:接收const引用或者const指针的函数可以分别用非const对象的引用或指针来调用。


           (2)数组或函数到指针的转换:如果模板形参不是引用类型,则对数组或函数类型的实参应用常规指针转换,数组实参将当做指向其第一个元素的指针,函数实参将当  做指向函数类型的指针。

二、模板参数

     函数模板的类型参数分为:模板参数和调用参数。

     模板形参分为:类型形参和非类型形参。

下面是含非模板类型的参数的函数模板:

     注意:1、模板形参的名字只能在模板形参之后到模板声明或定义的末尾之间使用,遵循类型屏蔽规则。

                 2、模板形参的名字在同一模板形参列表中出现一次。

                 3、所有模板形参前面必须加上class或者typename关键字修饰。





原创粉丝点击