C++ Templates读书笔记< 一 > 函数模版
* 并不是把模板编译成一个可以处理任何类型的单一实体,而是对于实例化模板参数的没种类型,都从模板产生出一个不同的实体。
* 具体类型代替模板参数的过程,叫做“实例化”
* 模板被编译了两次:
1。 实例化之前,检查模板本身的语法
2。 实例化期间,察看是否所有的调用都有效
* 函数模板内部,不能制定缺省的模板实参(类模板可以)。
* 函数模板的实参演绎:调用参数的类型构造自模板参数,所以模板参数和调用参数通常是相关的。
模板实参演绎并不适合返回类型。
* eg:
1 template< typename T1, typename T2 >
2 inline T1 max( T1 const& a, T2 const& b )
3 {
4 return a < b ? b : a;
5 }
2 inline T1 max( T1 const& a, T2 const& b )
3 {
4 return a < b ? b : a;
5 }
注:返回类型不能是引用。因为若返回T2类型实参,则T2需要转为T1,这个过程将会创建一个新的局部临时变量。
* 重载函数模版:
a> 一个非模板函数可以和一个同名的模版函数同时存在,并且该模板函数还可以被实例化为这个非模板函数。
b> 模板不允许自动类型转换,但普通非模板函数可以。
eg:
1 inline int const& max( int const& a, int const& b )
2 {
3 return a < b ? b : a;
4 }
5
6 template< typename T >
7 inline T const& max( T const& a, T const& b )
8 {
9 return a < b ? b : a;
10 }
11
12 max( 7.0, 42.0 ); // 调用max<double>
13 max( 'a', 'b' ); // 调用max<char>
14 max( 7, 42 ); // 调用int重载的非函数模板
15 max<>( 7, 42 ); // 调用max<int> 上述 a>
16 max<double>( 7, 42 ); // 调用max<double> 没有实参演绎
17 max< 'a', 42.7 >; // 调用int重载的非函数模板 上述 b>
2 {
3 return a < b ? b : a;
4 }
5
6 template< typename T >
7 inline T const& max( T const& a, T const& b )
8 {
9 return a < b ? b : a;
10 }
11
12 max( 7.0, 42.0 ); // 调用max<double>
13 max( 'a', 'b' ); // 调用max<char>
14 max( 7, 42 ); // 调用int重载的非函数模板
15 max<>( 7, 42 ); // 调用max<int> 上述 a>
16 max<double>( 7, 42 ); // 调用max<double> 没有实参演绎
17 max< 'a', 42.7 >; // 调用int重载的非函数模板 上述 b>
c> 函数的所有重载版本的声明都应该位于函数被调用的位置之前
分类:
C++
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】Flutter适配HarmonyOS 5知识地图,实战解析+高频避坑指南
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 为 Java 虚拟机分配堆内存大于机器物理内存会怎么样?
· .NET程序启动就报错,如何截获初期化时的问题json
· 理解 C# 中的各类指针
· C#多线程编程精要:从用户线程到线程池的效能进化论
· 如何反向绘制出 .NET程序 异步方法调用栈
· 换个方式用C#开发微信小程序
· 实现远程磁盘:像访问自己的电脑硬盘一样访问对方的电脑硬盘 (附Demo源码)
· 【.NET必读】RabbitMQ 4.0+重大变更!C#开发者必须掌握的6大升级要点
· .NET 10 Preview 4中ASP.NET Core 改进
· C#网络编程(四)----HttpClient