c++入门----模板
2023-03-14 22:49:43 时间
一.为什么要定义模板
当我们定义一个加法函数的时候,可能存在以下几种情况,int+int,int+float,flaot+float等等情况,这时候就需要我们定义多个操作相同的加法函数,这样显然是非常繁琐也是没有必要的。
模板的引入就是为了解决这一问题。该编程方式称为“泛型编程”,它的引入大大简化了程序的代码量,保持了结构的清晰,提高的程序设计的效率。
二. 函数模板的定义
定义如下:
template<模板参数表> 放回类型 函数名(参数列表) { 函数体 }
关键字template放在模板的定义前面,模板参数表不能为空。class或typename 修饰的类型参数代表一种类型,非类型参数由已知类型符,代表一个常量表达式。
template<class Any,class Another,int number> double fun(Any a,int b, Another c) { }
三.函数模板的使用
隐式实例化,下面模板的参数类型直到该函数真正被调用的时候才被决定。
#include<iostream> using namespace std; template<class Ex> Ex Greater(Ex x, Ex y); int main(void) { int intX=1,intY=2; double dblx = 3.0, dbly = 2.5; cout<<Greater(intX,intY)<<endl; cout<<Greater(dblx,dbly)<<endl; return 0; } template<class Ex> Ex Greater(Ex x, Ex y) { return x>y?x:y; }
2.显式实例化,每个模板函数只能被显式实例化一次,否则会出现重定义。
#include<iostream> using namespace std; template<class Ex> Ex Greater(Ex x, Ex y); template int Greater<int> (int ,int ); #显式实例化函数模板 int main(void) { int intX=1,intY=2; double dblx = 3.0, dbly = 2.5; cout<<Greater(intX,intY)<<endl; cout<<Greater(dblx,dbly)<<endl; return 0; } template<class Ex> Ex Greater(Ex x, Ex y) { return x>y?x:y; }
3.特化,c++引入了特化来解决某些类型在函数中的特殊操作,当编译器寻找到与函数调用的特化时,先使用特化的定义,不在使用模板函数,其定义的基本概述如下
template<> 返回类型 函数名 [<类型实参表>](函数参数表) { }
例子
#include<iostream> using namespace std; template<class Ex> Ex Greater(Ex x, Ex y); template<> double Greater<double>(double,double); #特化声明 int main(void) { int intX=1,intY=2; double dblx = 3.0, dbly = 2.5; cout<<Greater(intX,intY)<<endl; cout<<Greater(dblx,dbly)<<endl; return 0; } template<class Ex> Ex Greater(Ex x, Ex y) { return x>y?x:y; } template<> double Greater(double x , double y) { return x+y; }
4.重载,函数模板支持重载,既可以在模板之间重载,又可以在模板和普通函数间重载,但模板函数的重载相比普通函数的重载要复杂一些。重载的普通函数如下
char* Greater(char* x, char * y) { return (strcmp(x,y)>0?x:y); }
公众号:FPGA之旅
相关文章
- 支付宝上线长辈模式:字号大且无营销 65岁以上一键直达人工
- 聊聊iOS OC 对象的内存对齐原则
- 用两个案例,分析UI设计师如何避免用户不满与困惑
- 学好这个方法,可以解决80%的Logo设计
- 5G智能手机关键组成技术(一)天线技术
- 支付宝/微信已经很好用,我们为什么还要用数字人民币?
- 上亿人使用的QQ游戏中心,是如何做好宣发设计的?
- 什么时候需要二次确认?我梳理了常见的应用时机和方法
- 数字人民币试点,ATM机也迎来发展机会?能取现数字人民币了
- 安卓/iOS QQ齐升级:青少年模式独立密码
- iOS 15公测版发布,访问测试版站点即可提前尝鲜
- 数字人民币对现有金融体系的影响
- Swift 前沿技术 WWDC <T>技术沙龙落地快手总部 探讨移动端开发优化
- 谷歌Play商店要求开发者启用两步身份验证
- 如何清除 iOS APP 的启动屏幕缓存
- “尝鲜”数字人民币 安全与便利是首要前提
- Linux 平板电脑 JingPad A1 开启众筹,可媲美 iPad?
- 掌握这10条设计理论,帮你做出更容易过稿的体验设计
- 如何设计B端按钮?来看这篇高手总结!
- 电脑终于也能刷抖音!抖音网页版详细体验