• 正文
    • 1 函數(shù)模板
    • 2 實(shí)例
    • 3 總結(jié)
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

C++函數(shù)模板基礎(chǔ)

6小時(shí)前
212
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

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ù)模板的使用。

相關(guān)推薦

登錄即可解鎖
  • 海量技術(shù)文章
  • 設(shè)計(jì)資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄