網站首頁 編程語言 正文
定義
函數模板不是一個實在的函數,編譯器不能為其生成可執行代碼。定義函數模板后只是一個對函數功能框架的描述,當它具體執行時,將根據傳遞的實際參數決定其功能。
一個程序一般是經過預處理——>編譯——>匯編——>鏈接。但是因為程序無法知道模板的具體類型(int,double),所以無法進行預處理,也就不能生成可執行代碼。
例子
下面我們來看一個例子
我們在學習c語言的時候,當我們需要交換兩個數,我們是這樣做的
交換整數
void Swap(int & x, int & y)
{
int tmp = x;
x = y;
y = tmp;
}
交換小數
void Swap (double & xr double & y)
{
double tmp = x;
x = y;
y = tmp;
}
我們可以看出,只要類型做了變化,我們就需要重新寫一個幾乎不變的代碼,這是非常不方便的。
那么我們像活字印刷術一樣做一個模板出來讓編譯器根據自行推導類型呢?
于是模板就出現了。
對于上面的情況,我們模板是這樣處理的。
格式
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 類型參數1, class類型參數2, ...>
返回值類型 ?模板名(形參表)
{
? ? 函數體
}
意識就是說,我們在這里用template定義了一個模板”T”,當我們使用Swap的時候,計算機根據我們a,b(都是int)的類型,推出T應當是int 型。
實際上這個
void Swap(T & x, T & y)
變成了
void Swap (int & x, int & y)
但是需要注意,只有當a,b都是同類型的時候,計算機才能自動推到,如果是不同類型,我們將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;
}
就會出現:
因為兩個數一個int一個double,計算機就不知道給這個T賦int 還是double,這個時候有兩種處理方法
處理方法
第一種隱式實例化:讓編譯器根據實參推演模板參數的實際類型
#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);//在這個地方前面加<int>,計算機就會默認T為int型
}
第二種顯式實例化:在函數名后的<>中指定模板參數的實際類型
#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型,但是我們強制轉換為int之后,兩者的類型都相同,計算機就能自動推導了
}
原文鏈接:https://blog.csdn.net/qq_62718027/article/details/125585597
相關推薦
- 2022-05-17 ubuntu如何給 GoLand 設置桌面快捷圖標
- 2022-04-19 運行 npm run xxx 的時候都執行了些什么
- 2022-09-15 c語言實現數組循環左移m位_C 語言
- 2022-06-18 C語言中main函數與命令行參數詳細講解_C 語言
- 2022-06-19 python繪制散點圖和折線圖的方法_python
- 2022-08-16 一篇文章徹底搞懂Python切片操作_python
- 2022-05-25 pytorch?hook?鉤子函數的用法_python
- 2022-11-14 Python?prettytable模塊應用詳解_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支