模板学习

来源:互联网 发布:python arrow 编辑:程序博客网 时间:2024/06/10 01:15

模板的概念:
函数模板就是建立一个通用函数,其函数的类型和形参类型不具体指定,用一个虚拟的类型来代表,这个通用的函数就叫做函数模板

//函数1.

int max(int x,int y);{    return(x>y)?x:y ;}//函数2.float max( float x,float y){    return (x>y)? x:y ;}//函数3.double max(double x,double y){return (c>y)? x:y ;}

这里定义了一个int,一个float,一个double类型的函数,但如果在main函数中,我们分别定义了 char a,b; 那么在执行max(a,b);时 程序就会出错,因为我们没有定义char类型的重载版本。如果我们要实现所有类型都可行,那么就要定义所有类型的函数,好蛋疼。。。强大的C++怎么可能解决不了这样的问题呢,看下面…

现在,我们再重新审视上述的max()函数,它们都具有同样的功能,即求两个数的最大值,能否只写一套代码解决这个问题呢?这样就会避免因重载函数定义不 全面而带来的调用错误。为解决上述问题C++引入模板机制

模板意义:
模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数, 从而实现了真正的代码可重用性 所谓函数模板实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表,这个通用函数就称为函数模板。 凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需要在模板中定义一次即可。在调用函数时,系统会根据实参的类型来取代模板中的虚拟类型,从而实现了不同函数的功能。

模版可以分为两类,一个是函数模版,另外一个是类模版。

函数模板的写法:

/*函数模板的一般形式如下:template <class或typename T>返回类型 函数名(形参表){    //函数定义体 }说明: template是一个声明模板的关键字,表示声明一个模板关键字class不能省略,如果类型形参多余一个 ,每个形参前都要加class <类型 形参表>可以包含基本数据类型可以包含类类型.请看以下程序:*///Test.cpp#include <iostream>using std::cout;using std::endl;//声明一个函数模版,用来比较输入的两个相同数据类型的参数的大小,class也可以被typename代替,//T可以被任何字母或者数字代替。template <class T>T min(T x,T y){     return(x<y)?x:y;}void main(){     int n1=2,n2=10;     double d1=1.5,d2=5.6;     cout<< "较小整数:"<<min(n1,n2)<<endl;     cout<< "较小实数:"<<min(d1,d2)<<endl;     system("pause");}

程序运行结果:

 程序运行结果

程序分析:main()函数中定义了两个整型变量n1 , n2 两个双精度类型变量d1 , d2然后调用min( n1, n2); 即实例化函数模板T min(T x, T y)其中T为int型,求出n1,n2中的最小值.同理调用min(d1,d2)时,求出d1,d2中的最小值.

注意:
原生函数优先于模板函数
如果一定要调用模板函数,需要在函数后明确类型,也就是 实例化

#include<iostream>#include<cstdlib>using namespace std;//调用的时候才编译,不调用就不会编译double add(double a, double b){    cout << "原生函数" << endl;    return a + b + a + b;}template<class T>T add(T a, T b){    cout << "模板函数" << endl;    return a + b;}void main(){    cout << add(1, 2) << endl;//这里调用的是原生函数    cout << add<char>(1, 2) << endl;//这里指定了函数类型,所以调用的是模板函数    cout << add('1', '2') << endl;//这里没有指定类型,但是它的数据类型与原生函数不匹配,所以也会调用模板函数    system("pause");}

函数模板接口:

#include<iostream>#include<cstdlib>using namespace std;template<class T>void show(T num){    cout << num << endl;}template<class T, class P>//泛型接口,任何数据类型都可以void run(T num, P print){    print(num);//传递函数指针打印num}void main(){    run("abc", show<const char *>);//类型检测严格,必须明确类型(实例化)    system("pause");}

/**********************************end**************************************/

0 0