網(wǎng)站首頁 編程語言 正文
定義
函數(shù)模板不是一個(gè)實(shí)在的函數(shù),編譯器不能為其生成可執(zhí)行代碼。定義函數(shù)模板后只是一個(gè)對(duì)函數(shù)功能框架的描述,當(dāng)它具體執(zhí)行時(shí),將根據(jù)傳遞的實(shí)際參數(shù)決定其功能。
一個(gè)程序一般是經(jīng)過預(yù)處理——>編譯——>匯編——>鏈接。但是因?yàn)槌绦驘o法知道模板的具體類型(int,double),所以無法進(jìn)行預(yù)處理,也就不能生成可執(zhí)行代碼。
例子
下面我們來看一個(gè)例子
我們?cè)趯W(xué)習(xí)c語言的時(shí)候,當(dāng)我們需要交換兩個(gè)數(shù),我們是這樣做的
交換整數(shù)
void Swap(int & x, int & y)
{
int tmp = x;
x = y;
y = tmp;
}
交換小數(shù)
void Swap (double & xr double & y)
{
double tmp = x;
x = y;
y = tmp;
}
我們可以看出,只要類型做了變化,我們就需要重新寫一個(gè)幾乎不變的代碼,這是非常不方便的。
那么我們像活字印刷術(shù)一樣做一個(gè)模板出來讓編譯器根據(jù)自行推導(dǎo)類型呢?
于是模板就出現(xiàn)了。
對(duì)于上面的情況,我們模板是這樣處理的。
格式
template <class T>
void Swap(T & x, T & y)
{
T tmp = x;
x = y;
y = tmp;
}
template <class T>
void Swap(T& x, T& y)
{
T tmp = x;
x = y;
y = tmp;
}
int main()
{
int a = 3;
int b = 2;
Swap(a, b);
cout << a << endl<< b << endl;
return 0;
}
template <class 類型參數(shù)1, class類型參數(shù)2, ...>
返回值類型 ?模板名(形參表)
{
? ? 函數(shù)體
}
意識(shí)就是說,我們?cè)谶@里用template定義了一個(gè)模板”T”,當(dāng)我們使用Swap的時(shí)候,計(jì)算機(jī)根據(jù)我們a,b(都是int)的類型,推出T應(yīng)當(dāng)是int 型。
實(shí)際上這個(gè)
void Swap(T & x, T & y)
變成了
void Swap (int & x, int & y)
但是需要注意,只有當(dāng)a,b都是同類型的時(shí)候,計(jì)算機(jī)才能自動(dòng)推到,如果是不同類型,我們將b換為double類型
template <class T>
void Swap(T & x, T & y)
{
T tmp = x;
x = y;
y = tmp;
}
template <class T>
void Swap(T& x, T& y)
{
T tmp = x;
x = y;
y = tmp;
}
int main()
{
int a = 3;
double b = 2.5;
Swap(a, b);
cout << a << endl<< b << endl;
return 0;
}
就會(huì)出現(xiàn):
因?yàn)閮蓚€(gè)數(shù)一個(gè)int一個(gè)double,計(jì)算機(jī)就不知道給這個(gè)T賦int 還是double,這個(gè)時(shí)候有兩種處理方法
處理方法
第一種隱式實(shí)例化:讓編譯器根據(jù)實(shí)參推演模板參數(shù)的實(shí)際類型
#include<iostream>
using namespace std;
template<class T>
T Add(const T& left, const T& right)
{
return left + right;
}
int main()
{
int a1 = 10, a2 = 20;
double d1 = 10.0, d2 = 20.5;
Add<int>(a1, d2);//在這個(gè)地方前面加<int>,計(jì)算機(jī)就會(huì)默認(rèn)T為int型
}
第二種顯式實(shí)例化:在函數(shù)名后的<>中指定模板參數(shù)的實(shí)際類型
#include<iostream>
using namespace std;
template<class T>
T Add(const T& left, const T& right)
{
return left + right;
}
int main()
{
int a1 = 10, a2 = 20;
double d1 = 10.0, d2 = 20.5;
Add(a1,(int) d2);//此處d2原本是double型,但是我們強(qiáng)制轉(zhuǎn)換為int之后,兩者的類型都相同,計(jì)算機(jī)就能自動(dòng)推導(dǎo)了
}
原文鏈接:https://blog.csdn.net/qq_62718027/article/details/125585597
相關(guān)推薦
- 2022-05-24 Matplotlib實(shí)現(xiàn)各種條形圖繪制_python
- 2022-11-25 k8s?中的?service?如何找到綁定的?Pod?及實(shí)現(xiàn)?Pod?負(fù)載均衡的方法_云其它
- 2022-10-22 Golang?中反射的應(yīng)用實(shí)例詳解_Golang
- 2022-06-06 CZGL.ProcessMetrics處理監(jiān)控?cái)?shù)據(jù)的三種方式介紹_實(shí)用技巧
- 2022-10-17 C++STL教程之vector模板的使用_C 語言
- 2023-06-04 Pandas中MultiIndex選擇并提取任何行和列_python
- 2022-04-19 React?組件權(quán)限控制的實(shí)現(xiàn)_React
- 2022-04-27 ASP.NET?Core中的策略授權(quán)和ABP授權(quán)_實(shí)用技巧
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支