1 函數(shù)模板
1.1 基礎(chǔ)介紹
函數(shù)模板是一種特殊的函數(shù)定義,它允許你創(chuàng)建通用的函數(shù),這些函數(shù)可以處理多種不同的數(shù)據(jù)類型,而不需要為每種數(shù)據(jù)類型都編寫一個(gè)單獨(dú)的函數(shù)。
在 C++ 里,函數(shù)模板的格式包含模板聲明與函數(shù)定義兩部分,其基本格式如下:
template?<typename?T>
返回類型 函數(shù)名(參數(shù)列表)?
{
? ??// 函數(shù)體
}
template
關(guān)鍵字:用來聲明模板的起始標(biāo)志
<typename T>
:模板參數(shù)列表,定義了模板中使用的類型參數(shù)typename
是指定類型參數(shù)的關(guān)鍵字,也可以用?class
來替代,二者在功能上沒有區(qū)別。T
是類型參數(shù)的名稱,可以根據(jù)需要自定義,通常用?T
來表示 “類型(Type)”
返回類型:函數(shù)的返回值類型,可以是具體類型,也能是模板參數(shù)類型函數(shù)名:即函數(shù)的名稱,遵循 C++ 標(biāo)識(shí)符的命名規(guī)則即可參數(shù)列表:函數(shù)的參數(shù)列表,參數(shù)類型可以是具體類型,也可以是模板參數(shù)類型函數(shù)體:包含函數(shù)的具體實(shí)現(xiàn)代碼
1.2 函數(shù)模板與模板函數(shù)
1.2.1 函數(shù)模板
函數(shù)模板的重點(diǎn)是模板。函數(shù)模板是一個(gè)抽象的定義,是創(chuàng)建通用函數(shù)的工具。
1.2.2 模板函數(shù)
模板函數(shù)則是函數(shù)模板實(shí)例化后的具體函數(shù),用于處理特定類型的數(shù)據(jù)。
2 實(shí)例
由上面的函數(shù)模板的介紹,類型參數(shù)T可以在參數(shù)中使用,也可以在返回值中使用。
2.1 在參數(shù)和返回值中使用T
此函數(shù)模板?CalcMin
?接收兩個(gè)相同類型的參數(shù)?num1
?和?num2
,最終返回較小的那個(gè)值。
// 在參數(shù)和返回值中使用T
template?<typename?T>
T?CalcMin(T num1, T num2)
{
? ??return?num1 < num2 ? num1 : num2;
}
代碼優(yōu)勢(shì)
通用性:借助模板參數(shù)?T
,該函數(shù)可以處理任意支持小于運(yùn)算符?<
的數(shù)據(jù)類型,像?int
、double
、float
等,提高了代碼的復(fù)用性。
簡(jiǎn)潔性:代碼結(jié)構(gòu)簡(jiǎn)單,邏輯清晰,易于理解和維護(hù)。
2.2 在返回值中使用T
// 在返回值中使用T
template?<typename?T>
T?GetValue()
{
? ??return?T(5.68);
}
這個(gè)函數(shù)模板?GetValue
?不接收任何參數(shù),它的主要功能是返回一個(gè)由?T
?類型構(gòu)造的對(duì)象,該對(duì)象是通過將?5.68
?進(jìn)行類型轉(zhuǎn)換得到的。
2.3 在參數(shù)中使用T
這是一個(gè)帶有兩個(gè)類型參數(shù)?T1
?和?T2
?的函數(shù)模板?SetValue
。該函數(shù)接收兩個(gè)不同類型的參數(shù)?para1
?和?para2
,并將它們的值輸出到標(biāo)準(zhǔn)輸出流,展示參數(shù)的具體內(nèi)容。
// 在參數(shù)中使用T
template?<typename?T1,?typename?T2>
void?SetValue(T1 para1, T2 para2)
{
? ??std::cout?<<?"para1:"?<< para1 <<?", "?<<?"para2:"?<< para2 <<?std::endl;
}
代碼優(yōu)點(diǎn)
高度泛用性:借助模板參數(shù)?T1
和?T2
,函數(shù)可以處理任意兩種不同類型的參數(shù)組合,只要這些類型支持?<<
運(yùn)算符用于輸出到?std::cout
。這極大地增強(qiáng)了代碼的復(fù)用性,避免了為不同類型組合編寫多個(gè)類似函數(shù)的麻煩。
靈活性:調(diào)用者可以自由地傳入不同類型的參數(shù),函數(shù)會(huì)根據(jù)實(shí)際傳入的類型進(jìn)行實(shí)例化。
2.4 完整示例代碼
// g++ test1.cpp -std=c++11 -o test1
#include?<stdio.h>
#include?<iostream>
// 在參數(shù)和返回值中使用T
template?<typename?T>
T?CalcMin(T num1, T num2)
{
? ??return?num1 < num2 ? num1 : num2;
}
// 在返回值中使用T
template?<typename?T>
T?GetValue()
{
? ??return?T(5.68);
}
// 在參數(shù)中使用T
template?<typename?T1,?typename?T2>
void?SetValue(T1 para1, T2 para2)
{
? ??std::cout?<<?"para1:"?<< para1 <<?", "?<<?"para2:"?<< para2 <<?std::endl;
}
int?main()
{
? ??int?n1 =?5;
? ??int?n2 =?8;
? ??float?f1 =?6.6;
? ??float?f2 =?9.6;
? ??printf("min(%d,%d)=%dn", n1, n2, CalcMin(n1, n2));
? ??printf("min(%.2f,%.2f)=%.2fn", f1, f2, CalcMin(f1, f2));
? ??
? ??printf("get int %d(%.2f)n", GetValue<int>(), (float)(GetValue<int>()));
? ??printf("get float %.2fn", GetValue<float>());
? ??
? ? SetValue("6.89576",?"abcdefg");
? ??
? ??return0;
}
運(yùn)行效果如下
3 總結(jié)
本篇介紹了C++中的函數(shù)模板,并通過一些示例來演示函數(shù)模板的使用。