1:函数模板不是一个实在的函数,因此编译器不能为其生成可执行的代码。定义函数模板只是一个对函数功能框架的描述,在具体执行时,将根据传递的实际参数决定其功能。

2:函数模板定义的一般形式如下:

template <类型形式参数> 返回类型 函数名(形式参数表)

{

...//函数实现

}

其中template为关键字,表示定义一个模板,尖括号“<>”中为模板参数,模板参数主要有两种,一种是模板类型参数,另一种是模板非类型参数。上述代码中定义的模板使用的是模板类型参数,模板类型参数使用关键字class或typedef开始,其后是一个用户自定义的合法标识符。模板非类型参数和普通参数定义相同,通常为一个常数。

可以将声明函数模板分成template部分和函数名部分。例如:

template <class T>

void fun(T t)

{

...//函数实现

}

例如,下面的代码定义了一个求和的函数模板:

template <class type>//定义一个模板类型

type Sum(type xvar,type yvar)

{

return xvar+yvar;

}

在定义完函数模板之后,需要在程序中调用函数模板。下面的代码演示了Sum函数模板的调用。

int iret=Sum(10,20);//实现两个整数的相加

double dret=Sum(10,20.5);//实现两个实数的相加

如果采用如下的形式调用Sum函数模板,将会出现错误。

int iret=Sum(10.5,20);//错误的调用

double dret=Sum(10,20.5);//错误的调用

上述代码中为函数模板传递了两个类型不同的参数。导致编译器产生了歧义。如果在调用函数模板时显示表示模板类型就不会出现错误。例如:

int iret=Sum<int>(10.5,20);//正确地调用函数模板

double dret=Sum<double>(10,20.5);//正确地调用函数模板

用函数模板生成实际可执行的函数又称为模板函数。函数模板与模板函数不是一个概念。从本质上讲,函数模板是一个“框架”,它不是真正可以编译生成代码的程序,而模板函数是把函数模板中的类型参数实例化后生成的函数,它和普通函数本质上是相同的,可以生成可执行代码。

3:函数模板的作用

假设求两个函数之中的最大者,如果想求整形数和实型数,那么需要定义两个函数,这两个函数定义如下:

int max(int a,int b)

{

return a>b?a:b;

}

float max(float a,float b)

{

return a>b?a:b;

}

如果想通过一个max函数来完成既求整型数之间最大者又求实型数之间的最大者,则可以使用函数模板和#define宏定义来实现。

#define宏定义可以在预编译期对代码进行替换。例如:

#define max(a,b) ((a)>(b)?(a):(b))

上述代码可以求整数最大值和实型数最大值。但宏定义#define只是进行简单替换,它无法对类型进行检查,有时计算结果可能不是想要的。

使用模板函数求最大值的代码如下:

template<class Type>

Type max(Type a,Type b)

{

if(a>b)

return a;

else

return b;

}

调用模板函数max可以分别正确地计算出整型数和实型数的最大值。例如:

cout<<“最大值:”<<max(10,1)<<endl;

cout<<“最大值:”<<max(200.05,100.4)<<endl;

4:使用数组作为模板函数,代码如下:

// 9.1.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
template <class type,int len> //定义一个模板类型
type Max(type array[len]) //定义函数模板
{
type ret = array[]; //定义一个变量
for(int i=; i<len; i++) //遍历数组元素
{
ret = (ret > array[i])? ret : array[i]; //比较数组元素大小
}
return ret; //返回最大值
}
void main()
{
int array[] = {,,,,}; //定义一个整型数组
int iret = Max<int,>(array); //调用函数模板Max
double dset[] = {10.5,11.2,9.8}; //定义实数数组
double dret = Max<double,>(dset); //调用函数模板Max
cout << dret << endl;
}

运行结果:

程序中定义了一个函数模板Max,用来求数组中元素的最大值,其中,模板参数使用模板类型参数type和模板非类型参数len,参数type 声明了数组中的元素类型,参数len声明了数组中的元素个数,给定数组元素后,程序将数组中的最大值输出。

C++入门经典-例9.1-函数模板,函数模板的作用,使用数组作为模板参数的更多相关文章

  1. C++入门经典-例5.8-使用指针函数进行运算

    1:函数指针式指向函数内存的指针,一个函数在编译时被分配给一个入口地址,这个函数的入口地址就称为函数指针.可以用一个指针变量指向函数,然后通过该指针变量调用此函数. 一个函数可以返回一个整数型值.字符 ...

  2. C++入门经典-例5.7-调用自定义函数交换两变量值,传入指针

    1:代码如下: // 5.7.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using ...

  3. C++入门经典-例4.6-使用重载函数

    1:代码如下: // 4.6.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using ...

  4. C++入门经典-例6.15-通过字符串函数连接两个字符数组

    1:代码如下 // 6.15.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using ...

  5. C++入门经典-例9.3-类模板,简单类模板

    1:使用template关键字不但可以定义函数模板,而且可以定义类模板.类模板代表一族类,它是用来描述通用数据类型或处理方法的机制,它使类中的一些数据成员和成员函数的参数或返回值可以取任意数据类型.类 ...

  6. C++入门经典-例8.7-多态,利用虚函数实现动态绑定

    1:多态性是面向对象程序设计的一个重要特征,利用多态性可以设计和实现一个易于扩展的系统.在C++语言中,多态是指具有不同功能的函数可以用同一个函数名,这样就可以用一个函数名调用不同内容的函数,发出同样 ...

  7. Oracle编程入门经典 第11章 过程、函数和程序包

    目录 11.1          优势和利益... 1 11.2          过程... 1 11.2.1       语法... 2 11.2.2       建立或者替换... 2 11.2 ...

  8. C++入门经典-例5.20-右值引用传递参数

    1:使用字面值(如1.3.15f.true),或者表达式等临时变量作为函数实参传递时,按左值引用传递参数会被编译器阻止.而进行值传递时,将产生一个和参数同等大小的副本.C++11提供了右值引用传递参数 ...

  9. C++入门经典-例9.2-重载函数模板,求出字符串的最小值

    1:整形数和实型数编译器可以直接进行比较,所以使用函数模板后也可以直接进行比较,但如果是字符指针指向的字符串该如何处理呢?这时可以通过重载函数模板来实现.通常字符串需要库函数来进行比较,通过重载函数模 ...

随机推荐

  1. opencv 仿射变换 投射变换, 单应性矩阵

    仿射 estimateRigidTransform():计算多个二维点对或者图像之间的最优仿射变换矩阵 (2行x3列),H可以是部分自由度,比如各向一致的切变. getAffineTransform( ...

  2. js之数据类型(对象类型——构造器对象——数组1)

    数组是值的有序集合,每个值叫做一个元素,而每一个元素在数组中有一个位置,以数字表示,称为索引.JavaScript数组是无类型的,数组元素可以是任意类型且同一个数组中不同元素也可能有不同的类型.数组的 ...

  3. shell脚本视频学习2

    一.函数 1.函数格式 2.函数传入参数 3.手动输入函数中的参数 4.函数返回值 成功返回0,失败返回1 5.输入一个目录,判断目录是否存在,如果不存在则给出提示,如果存在则提示输入要创建的文件名, ...

  4. XDCTF2014 Writeup

    Web50 猜谜语类题目?FLAG在图片中有一些字符的 ASCii值,拼起来就是FLAG. Web100 隐写术.使用工具 StegSolve,把任一颜色的bit0拼起来图片的最开始部分即为  fla ...

  5. docker使用上的错误

    docker启动问题 Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon ...

  6. shodan使用

    简介 与谷歌不同的是,Shodan不是在网上搜索网址,而是直接进入互联网的背后通道.Shodan可以说是一款“黑暗”谷歌,一刻不停的在寻找着所有和互联网关联的服务器.摄像头.打印机.路由器等等.每个月 ...

  7. libusb 3.0

    1)usb3.0 在windows使用winusb时,出现ReadFile的input buffer 太大时,读不到数据问题? 2)linux下,usb 3.0 libusb_claim_interf ...

  8. golang 系列学习(-) 数据类型

    数据类型的出现 在的编程语言中,数据类型用于声明函数和变量,数据类型的出现是为了要把数据分成数据所需要内存大小的不同数据,编程时需要什么样的内存就申请什么样的内存.就可以充分的利用内存,更好的霸控程序 ...

  9. CF892E Envy[最小生成树]

    题意:有一张 $n$ 个点$ m $条边的连通图.有$Q$ 次询问.每次询问给出 $k[i]$ 条边,问这些边能否同时出现在一棵最小生成树上.$n,m,Q,\sum k\le 500000$. 这题利 ...

  10. MySQL Audit日志审计

    一.简介 数据库审计能够实时记录网络上的数据库活动,对数据库操作进行细粒度审计的合规性管理,对数据库受到的风险行为进行告警,对攻击行为进行阻断,它通过对用户访问数据库行为的记录.分析和汇报,用来帮助用 ...