泛型编程之函数模板

》模板的引入,为什么要使用模板?

在程序设计中往往存在这样一种现象:两个或多个函数的函数体完全相同,差别仅在于他们的参数类型不同,就需要分别给不同的数据类型定义不同的版本。

解决以上问题的一个比较好的方法就是使用模板。模板是实现代码重用机制的一种工具,他可以实现类型参数化,即把类型定义为参数,从而实现代码复用。

》模板的分类:

模板分为函数模板和类模板。他们分别允许用户构造模板函数和模板类。

》函数模板:

建立一个通用函数,其函数返回类型和形参类型不确定,用一个虚拟的类型来代表,这个通用函数就称为函数模板。

函数模板声明格式:

template <typename 类型参数>

返回类型 函数名(模板形参表)

{函数体

}

其中template是一个表明声明一个模板的关键字;

typename也可以用class作用一样表示其后是一个虚拟的类型名;

类型参数实际上是一个类型名;

例:

template <typename T>
T max(T x, T y)
{
	return (x > y) ? x : y;
}

》如何使用函数模板

上面max()函数代表一类函数,要使用这个模板函数就需要将T实例化为确定的数据类型,这个实例化的参数就叫做模板实参。

函数名(模板实参表)

例:

template <typename T>
T max(T x, T y)
{
return (x > y) ? x : y;
}
int main()
{
int i1 = 19,i2=23;
double d1 = 50.344, d2 = 4656.346;
char c1 = ‘k‘, c2 = ‘n‘;
cout << "The max of i1,i2 is= " << max(i1, i2) << endl;
cout << "The max of d1,d2 is= " << max(d1, d2) << endl;
cout << "The max of c1,c2 is= " << max(c1, c2) << endl;
return 0;
}

结果:

从上例看出,函数模板提供了一类函数的抽象,它以类型参数T为参数及函数返回值的虚拟类型。函数模板经实例化而生成的具体函数称为模板函数。

》一个和指针相关的函数模板

template <typename AT>
AT sum(AT* array, int size = 0)
{
AT total = 0;
for (int i = 0; i < size; i++)
{
total += array[i];
}
return total;
};
int int_array[] = { 11, 22, 33, 44, 55, 66, 77, 88, 99, 1010 };
double double_array[] = { 11.1,22.2,33.3, 44.4, 55.5, 66.6, 77.7, 88.8, 99.9, 100.10 };
int main()
{
int itotal = sum(int_array, 10);
double dtotal = sum(double_array, 10);
cout << "这个整型数组的元素之和是:" << itotal << endl;
cout << "这个双精度型数组的元素之和是:" << dtotal << endl;
return 0;
}

结果:

在程序中生成了两个模板函数,sum(int_array)和sum(double_array)分别将类型参数实例化为int型和double型。

》同样的函数模板也允许使用多个类型参数,但是template定义部分的每个类型参数前必须要有关键字typename。

template <typename para1,typename para2>
void two_para(para1 x, para2 y)
{
cout << x << ‘ ‘ << y << endl;
}
int main()
{
two_para(99, "zhang");
two_para(123.45, 888L);
return 0;
}

结果:

1.在这个程序中,生成了两个模板函数,“two_para(99,"zhang")”,分别用模板实参int,char*将类型参数para1和para2实例化,“two_para(123.45,888L)”,分别用模板实参double,long将类型参数para1和para2实例化,

2.在template语句与函数模板定义语句之前不允许插入别的语句。

3.同一般函数一样,函数模板也可以重载。

template <typename Type>
Type min(Type x, Type y)
{
	return (x < y) ? x : y;
}

template <typename Type>
Type min(Type x, Type y, Type z)
{
	Type t;
	t = (x < y) ? x : y;
	return (t < z) ? t: z;
}

int main()
{
	int m = 10, n = 20, min2;
	double a = 10.1, b = 20.2, c = 30.3, min3;
	min2 = min(m, n);
	min3 = min(a, b, c);
	cout << "min(" << m << "," << n << ")=" << min2 << endl;
	cout << "min(" << a << "," << b << "," << c << ")=" << min3 << endl;
	return 0;
}

结果:

》函数模板和非函数模板可以重载,调用顺序是:首先寻找一个参数完全匹配的非函数模板,如果找到就调用它,如果没有就寻找函数模板将其实例化,产生一个匹配的模板函数。

时间: 2024-08-03 09:08:05

泛型编程之函数模板的相关文章

C++提高1 【泛型编程】函数模板 类模板

[本文谢绝转载] [泛型编程] 函数模板 为什么会有函数模板 现象: 函数的业务逻辑一样 函数的参数类型不一样 [最常用]函数模板  显式的调用 [不常用]类型推导 多个参数,参数定义了必须要用 函数模板,实现int类型数组,char字符串排序: 函数模板 与 普通函数的本质区别 函数模板 和 普通函数在一起 的调用型研究: C++是如何支持函数模板机制的? 函数模板机制结论 类模板 类模板的定义 类模板做函数的参数 类模板的派生成普通类 模板类的派生成模板类 复数类,所有函数都写在类的内部,运

C++泛型编程之函数模板

泛型语义 泛型(Generic Programming),即是指具有在多种数据类型上皆可操作的含意.泛型编程的代表作品 STL 是一种高效.泛型.可交互操作的软件组件. 泛型编程最初诞生于 C++中,目的是为了实现 C++的 STL(标准模板库).其语言支持机制就是模板(Templates). 模板的精神其实很简单:类型参数化(type parameterized),即,类型也是一种参数,也是一种静多态. 换句话说, 把一个原本特定于某个类型的算法或类当中的类型信息抽掉,抽出来做成模板参数. 函

25.C++- 泛型编程之函数模板(详解)

1)初探函数模板 2)深入理解函数模板 3)多参函数模板 4)重载函数模板 当我们想写个Swap()交换函数时,通常这样写: 但是这个函数仅仅只能支持int类型,如果我们想实现交换double,float,string等等时,就还需要从新去构造Swap()重载函数,这样不但重复劳动,容易出错,而且还带来很大的维护和调试工作量.更糟的是,还会增加可执行文件的大小. 函数模板 一种特殊的函数,可通过不同类型进行调用 函数模板是C++中重要的代码复用方式 通过template关键字来声明使用模板 通过

C++笔记(7):泛型编程和模板(函数模板和类模板)

泛型编程和模板 0.泛型编程 1.函数模板 2.类模板 ----------------------------------------------------------------------------------------------------------- 0.泛型编程 所谓泛型就是以独立于任何特定类型的方式编写代码.前面介绍的标准库的容器.迭代器和算法都是泛型编程的具体应用. 模板是泛型编程的基础.使用模板的时候不需要知道模板是如何定义的,但今天我们来介绍如何定义自己的模板类和模

【C/C++学院】(11)泛型编程/函数模板/类模板

1.泛型编程基础 #include "iostream" using namespace std; void swap(int &a, int &b) { int c; c = a; a = b; b = c; } void swap(float &a, float &b) { float c; c = a; a = b; b = c; } void main() { int a = 1, b = 2; swap(a, b); float a1 = 1,

C++ Primer 学习笔记_86_模板与泛型编程 --重载与函数模板

模板与泛型编程 --重载与函数模板 引言: 函数模板可以重载:可以定义有相同名字但参数数目或类型不同的多个函数模板,也可以定义与函数模板有相同名字的普通非模板函数. 但是,声明一组重载函数模板不保证可以成功调用它们,重载的函数模板可能会导致二义性. 一.函数匹配与函数模板 如果重载函数中既有普通函数又有函数模板,确定函数调用的步骤如下: 1.为这个函数名建立候选函数集合,包括: a.与被调用函数名字相同的任意普通函数. b.任意函数模板实例化,在其中,模板实参推断发现了与调用中所用函数实参相匹配

C++ Primer 学习笔记_86_模板与泛型编程 -满载与函数模板

模板与泛型编程 --重载与函数模板 引言: 函数模板可以重载:可以定义有相同名字但参数数目或类型不同的多个函数模板,也可以定义与函数模板有相同名字的普通非模板函数. 但是,声明一组重载函数模板不保证可以成功调用它们,重载的函数模板可能会导致二义性. 一.函数匹配与函数模板 如果重载函数中既有普通函数又有函数模板,确定函数调用的步骤如下: 1.为这个函数名建立候选函数集合,包括: a.与被调用函数名字相同的任意普通函数. b.任意函数模板实例化,在其中,模板实参推断发现了与调用中所用函数实参相匹配

模板与泛型编程1(函数模板)

定义.实例化函数模板: 对于函数体完全相同,唯一差异就是参数类型的情况,我们可以定义一个通用的函数模板,而非为每个类型都定义一个新函数: 1 #include <iostream> 2 #include <vector> 3 using namespace std; 4 5 template <typename T>//模板参数列表 6 int compare(const T &v1, const T &v2) { 7 if(v1 < v2) re

第56课 函数模板的概念和意义

1. 发散性问题:C++中的几种交换变量的方法 (1)宏代码块 VS 函数 [编程实验]变量的交换 #include <iostream> #include <string> using namespace std; //宏定义代码块 #define SWAP(t, a, b) do { t c = a; a = b; b = c; }while(0); //定义函数方式 void Swap(int& a, int& b) { int c = a; a = b; b