chp8-模板.pptx
《chp8-模板.pptx》由会员分享,可在线阅读,更多相关《chp8-模板.pptx(34页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、第八章 模板C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第八章 模板28.1 案例-类型带来的困扰8.1.1 案例及其实现8.1.1.1 被类型困扰的变量constdoublepilf=3.1415926536;constintpii=3;constchar*pis=3.1415926536;std:cout1.2*1.2*pilfstd:endl;std:cout2*2*piistd:endl;std:coutstd:string(3*3*)+pisstd:endl;定义多个不同名的变量C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第八章 模板38.1 案例-类
2、型带来的困扰8.1.1 案例及其实现8.1.1.2 被类型困扰的函数usingcstring=char*;boollt(inta,intb)returnab;boollt(size_ta,size_tb)returnab;boollt(doublea,doubleb)returnab;boollt(cstringa,cstringb)returnstrcmp(a,b)0;定义多个重载版本尤其是这三个:除了参数类型,其余部分完全一样C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第八章 模板48.1 案例-类型带来的困扰8.1.1 案例及其实现8.1.1.3 被类型困扰的类class
3、linked_list_intpublic:usingvalue_t=int;/类型别名private:struct_nodevalue_tdata;classlinked_list_doublepublic:usingvalue_t=double;/类型别名private:struct_nodevalue_tdata;可以想象:这两个类,除了数据的类型,其余部分完全一样这无疑增大了代码维护的难度,也是软件的生产率降低。类型是最大障碍C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第八章 模板58.1 案例-类型带来的困扰8.1.1 案例及其实现8.1.1.4 使用宏绕开类型的限制
4、#definepi(type)(type)(3.1415926536)#definelt(a,b)(a)(b)#definellist(type)classlinked_list_#typepublic:usingvalue_t=type;然而,宏是一种无类型机制,依然无法处理类型失配问题。因此,问题的焦点在于:能否将类型作为参数?答案是:模板C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第八章 模板templateconstTpi=static_cast(3.1415926536);std:cout1.2*1.2*pistd:endl;std:cout2*2*pistd:end
5、l;templateTvar;var=9;var=variabletemplate;std:coutvar,varstd:endl;68.2 变量模板8.2.1 定义和使用变量模板T称为类型参数C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第八章 模板templateconstTpi=static_cast(3.1415926536);usingcstring=constchar*;templatecstringpi=3.1415926536;78.2 变量模板8.2.2 变量模板的特化C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第八章 模板template返回值
6、类型函数名(参数列表)/函数体88.3 函数模板8.3.1 定义和使用函数模板类型参数非类型参数C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第八章 模板/定义函数模板templateboollt2(Ta)returnathreshold;/使用函数模板floata1.0f;lt2(a);/实例化98.3 函数模板8.3.1 定义和使用函数模板8.3.1.1 函数模板的实例化这是隐式实例化。编译器会根据实际参数的类型自动生成对应的版本。可以认为编译生成的实例是这样的:boollt2(floata)C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第八章 模板autolt
7、3=(autoa,autob)-boolreturnaboolreturnab;108.3 函数模板8.3.1 定义和使用函数模板8.3.1.4 泛型lambdaC+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第八章 模板templateboollt(Ta,Tb)returnab;lt(1.0,2);118.3 函数模板8.3.2 函数模板的重载和特化8.3.2.1 重载这个实例化会产生什么结果?事实上,编译器会因无法确定类型报出错误。该如何解决呢?C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第八章 模板templateboollt(Ta,Tb)returnab;/
8、重载的模板templateboollt(Ta,Ub)returnab;/重载的函数boollt(doublea,intb)returnab;128.3 函数模板8.3.2 函数模板的重载和特化8.3.2.1 重载C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第八章 模板templateboollt(Ta,Tb)returnab;usingcstring=char*;templateboollt(cstringa,cstringb)returnstrcmp(a,b)0;138.3 函数模板8.3.2 函数模板的重载和特化8.3.2.2 特化模板参数类型没有cv修饰符因此特化的模板参
9、数类型也必须没有cv修饰符C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第八章 模板templatevoidf(T,U)templatevoidf(int,char)/完全特化templatevoidf(T,int)/偏特化148.3 函数模板8.3.2 函数模板的重载和特化8.3.2.2 特化-偏特化只用到了部分模板参数C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第八章 模板voidf(int&)voidf(int&)templatevoidwrapper2(T&a)f(std:forward(a);158.3 函数模板8.3.3 完美转发模板保证按原始参数类型
10、匹配到f的正确版本函数形参的类型模板中类型参数T的类型折叠后的函数形参类型A&T&T&A&T&T&A&T&T&A&T&T&C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第八章 模板templateautosum_unaryleft(Args.args)return(.+args);/()不可少!sum_unaryleft(1,2,3);/=(1+2)+3)168.3 函数模板8.3.4 折叠表达式C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第八章 模板templateclass类名/成员定义/成员可以是:数据、函数、类和模板178.4 类模板8.4.1 定义和使用
11、类模板类型参数非类型参数C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第八章 模板templateclasslinked_listpublic:usingvalue_type=value_t;usingreference=value_t&;usingpointer=value_t*;protected:struct_nodevalue_typedata;public:voidpush_back(value_typed);188.4 类模板8.4.1 定义和使用类模板8.4.1.1 定义类模板在模板的内部定义与模板类型参数相关的类型别名。然后在模板的实现中使用这些别名。C+程序设计
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- chp8 模板
限制150内