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