[简介]
常用网名: 猪头三
出生日期: 1981.XX.XX
QQ: 643439947
个人网站: 80x86汇编小站 https://www.x86asm.org
编程生涯: 2001年~至今[共22年]
职业生涯: 20年
开发语言: C/C++、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python
开发工具: Visual Studio、Delphi、XCode、Eclipse、C++ Builder
技能种类: 逆向 驱动 磁盘 文件
研发领域: Windows应用软件安全/Windows系统内核安全/Windows系统磁盘数据安全/macOS应用软件安全
项目经历: 磁盘性能优化/文件系统数据恢复/文件信息采集/敏感文件监测跟踪/网络安全检测
[序言]
最近在努力地学习C++20的相关知识点, 给自己订下一个小目标: 把自身已掌握的陈旧C++98, C++03逐步升级到C++20. 以适应现代C++开发的要求. 在学习和复习的过程中, 顺便记录疑惑点.
[复习和巩固][函数模板, 模板编程也叫泛型编程]
其实是源于"函数重载"的思想, 说白了"函数模板"就是针对参数类型重载, 在函数的参数列表用中 所有参数的类型都用一个简单的字符代替了. 比如用 T 这个字母就可以代替所有类型int, double, char 等等.
[应用场景, 这里简单的举例, 实际上模板很强大的]
比如有一个函数, 是计算一个物体的体积, 那么需要3个int类型的参数表示 长 宽 高.
int getVolume(int lenght, int width, int height)
那么过一段时间后,你会突然觉得, 需要提升获取体积的精度了. 那么就要采纳double类型的参数, 然后又要重载了getVolume函数
double getVolume(double lenght, double width, double height)
这样你就会发现, 相同计算体积功能的函数, 竟然写了2份代码, 很冗余, 有没有一种办法把这2个函数合并起来, 同时兼容int和double类型的处理呢? 答案肯定有的, 这就是这篇文章的主题: 函数模板
[下面的代码, 教会你如何把getVolume()函数转换为模板函数]
template<typename T> // 或者 template<class T>
T getVolume(T lenght, T width, T height)
{T Volume = lenght * width * height ;return Volume ;
}int _tmain(int argc, _TCHAR* argv[])
{// 让控制台程序支持显示中文std::locale::global(std::locale("")) ;int int_Lenght{1}, int_Width{2}, int_Height{3} ;std::wcout << L"体积为(int类型): " << getVolume(int_Lenght, int_Width, int_Height) << std::endl;double double_Lenght{1.5}, double_Width{2.6}, double_Height{3.7} ;std::wcout << L"体积为(double类型): " << getVolume(double_Lenght, double_Lenght, double_Lenght) << std::endl;}
代码解释:
1> 所有函数模板定义都以template关键字开始,后面跟着用一个尖括号<>括起来的模板参数列表.
2> 模板参数列表中的每个参数前面都有关键字typename或者关键字class. 其实typename和class是一样效果, 本例子使用的是typename
3> 类型参数是基本类型或者用户自定义类型的占位符. 本例子使用的是 T, 意思是说T这个占位符, 可以代表int, double, char, 等等
4> T getVolume(T lenght, T width, T height) 表示该函数模板有3个类型为T的参数, 并且返回类型也为T
[函数模板的工作方式]
编译器在程序源码中遇到对getVolume()调用时, 会在整个模板定义中将getVolume()里面的T替换为实参类型. 比如本例子传入的实参是int和double, 那么该函数模板就会被创建一个完成的"函数模板特化", 如下所示:
int getVolume(int lenght, int width, int height)
{int Volume = lenght * width * height ;return Volume ;
}double getVolume(double lenght, double width, double height)
{double Volume = lenght * width * height ;return Volume ;
}
[结尾]
从本例子可以学习到一个代码优化的经验, 通过函数模板来使项目的代码更加整洁干净. 当然函数模板还支持多个类型参数的处理, 希望大家可以通过这个简单的例子, 继续深入探究"多参数函数模板"的写法和使用.