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. O033、Terminate Instance 操作详解

    参考https://www.cnblogs.com/CloudMan6/p/5486066.html   本节通过日志详细分析 Nova Terminate 操作.Terminate 操作就是删除 i ...

  2. python 访问权限

    访问权限 权限: 公有的:类中的普通属性和方法,默认都是公有的,可以在类的内部.外部.子类中使用 私有的:定义是在前面加两个'_',只能在本类的内部使用,不能再外部及子类中使用 示例: class P ...

  3. python 利用pyttsx3文字转语音

    # -*- coding: utf-8 -*- import pyttsx3 f = open("all.txt",'r') line = f.readline() engine ...

  4. Redis-ZSet常用命令

    Redis-ZSet常用命令 zadd key score member[{score member}-] 创建或设置指定key对应的有序集合,根据每个值对应的score来排名,升序.例如有命令 za ...

  5. U盘被识别但不显示盘符怎么样才能解决?

    很多朋友在将U盘插入电脑后,会发现右下角的任务栏虽然出现了U盘的图标,但是在我的电脑中并没有显示出U盘的盘符,也就无法继续对U盘进行操作.遇到这种情况该怎么办呢?下面好系统U盘启动就告诉大家相应的解决 ...

  6. DataGrip导出查询结果数据

    1 按钮 2 选择保存位置即可

  7. Oracle【序列、索引、视图、分页】

    1.Oracle序列语法:create sequence 序列名 特点1:默认是无值,指针指向没有值的位置 特点2:序列名.nextval 每次执行值会自增一次,步长为 1 特点3:序列名.currv ...

  8. Beta冲刺——星期三

    这个作业属于哪个课程 <课程的链接> 这个作业要求在哪里 <作业要求的链接> 团队名称 飞猪们 这个作业的目标 剩余任务预估,分配任务(开发,测试等).按要求提交当天冲刺报告. ...

  9. Satellite-Hacking 攻击卫星/卫星安全

    虽说卫星安全这种东西也是高富帅才玩得起的领域,但是了解了解总是没坏处.参考了一些资料,如果想详细了解可以戳进去看看.看了这么多资料,总结一下吧. Why? 卫星存在安全问题主要有一下俩原因,首先是成本 ...

  10. javascript代码实用方法实现

    javascript代码实用方法实现   针对现在大家平时开发中,都会写一些重复性的js处理代码,今天总结了几个比较常用的方法实现.获取get请求参数.去字符串空格.   1.获取get请求中的参数  ...