泛型编程之函数模板-创新互联
》模板的引入,为什么要使用模板?
创新互联长期为上1000+客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为凤县企业提供专业的成都做网站、成都网站建设、成都外贸网站建设,凤县网站改版等技术服务。拥有十年丰富建站经验和众多成功案例,为您定制开发。在程序设计中往往存在这样一种现象:两个或多个函数的函数体完全相同,差别仅在于他们的参数类型不同,就需要分别给不同的数据类型定义不同的版本。
解决以上问题的一个比较好的方法就是使用模板。模板是实现代码重用机制的一种工具,他可以实现类型参数化,即把类型定义为参数,从而实现代码复用。
》模板的分类:
模板分为函数模板和类模板。他们分别允许用户构造模板函数和模板类。
》函数模板:
建立一个通用函数,其函数返回类型和形参类型不确定,用一个虚拟的类型来代表,这个通用函数就称为函数模板。
函数模板声明格式:
template
返回类型 函数名(模板形参表)
{函数体
}
其中template是一个表明声明一个模板的关键字;
typename也可以用class作用一样表示其后是一个虚拟的类型名;
类型参数实际上是一个类型名;
例:
templateT max(T x, T y) { return (x > y) ? x : y; }
》如何使用函数模板
上面max()函数代表一类函数,要使用这个模板函数就需要将T实例化为确定的数据类型,这个实例化的参数就叫做模板实参。
函数名(模板实参表)
例:
templateT 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为参数及函数返回值的虚拟类型。函数模板经实例化而生成的具体函数称为模板函数。
》一个和指针相关的函数模板
templateAT 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。
templatevoid 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.同一般函数一样,函数模板也可以重载。
》
templateType min(Type x, Type y) { return (x < y) ? x : y; } template 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; }
结果:
》函数模板和非函数模板可以重载,调用顺序是:首先寻找一个参数完全匹配的非函数模板,如果找到就调用它,如果没有就寻找函数模板将其实例化,产生一个匹配的模板函数。
创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。
当前文章:泛型编程之函数模板-创新互联
当前链接:http://azwzsj.com/article/ceocpi.html