简单掌握C++中的函数模板
1.函数模板的声明和模板函数的生成 <返回类型><函数名>(参数表) { 函数体 } 其中,template是定义模板函数的关键字;template后面的尖括号不能省略;typename(或class)是声明数据类型参数标识符的关键字,用以说明它后面的标识符是数据类型标识符。这样,在以后定义的这个函数中,凡希望根据实参数据类型来确定数据类型的变量,都可以用数据类型参数标识符来说明,从而使这个变量可以适应不同的数据类型。例如: template<typename T> T fuc(T x,int y) { T x; //…… } 如果主调函数中有以下语句: double d; int a; fuc(d,a); 则系统将用实参d的数据类型double去代替函数模板中的T生成函数: double fuc(double x,int y) { double x; //…… } 函数模板只是声明了一个函数的描述即模板,不是一个可以直接执行的函数,只有根据实际情况用实参的数据类型代替类型参数标识符之后,才能产生真正的函数。 <返回类型><函数名>(参数表) { 函数体 } (2)在template语句与函数模板定义语句<返回类型>之间不允许有别的语句。如下面的声明是错误的:
template<class T> int I; T min(T x,T y) { 函数体 } (3)模板函数类似于重载函数,但两者有很大区别:函数重载时,每个函数体内可以执行不同的动作,但同一个函数模板实例化后的模板函数都必须执行相同的动作。 2 函数模板的异常处理 template<typename T> void min(T &x,T &y) { return (x<y)?x:y; } void func(int i,char j) { min(i,i); min(j,j); min(i,j); min(j,i); } 例子中的后两个调用是错误的,出现错误的原因是,在调用时,编译器按最先遇到的实参的类型隐含地生成一个模板函数,并用它对所有模板函数进行一致性检查,例如对语句 min(i,j); 先遇到的实参i是整型的,编译器就将模板形参解释为整型,此后出现的模板实参j不能解释为整型而产生错误,此时没有隐含的类型转换功能。解决此种异常的方法有两种: void min(T &x,T &y) { return (x<y)?x:y; } int min(int,int); void func(int i,i); } 执行该程序就不会出错了,因为重载函数支持数据间的隐式类型转换。 3.小例子 #include <iostream> #include <string> using namespace std; template<class T> void swap(T *x,T *y){//函数的模板,只要能使用等号赋值类型都可以用这个模板互换 T temp = *x; *x = *y; *y = temp; } void main(){ int i = 9,j = 5; float k = 9.2,l = 5.6; swap(&i,&j);//交换整形 swap(&k,&l);//交换浮点型 cout<<"i = "<<i<<",j = "<<j<<endl; cout<<"k = "<<k<<",l = "<<l<<endl; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |