大家好,上次我們講了模闆程式設計的好處,它的好處主要是實作資料類型和邏輯代碼相分離,進而實作代碼的高度複用。這次,我們就來看一下如何在C++中定義一個函數模闆,通過函數模闆實作算法與資料類型相分離。
首先,請讓我介紹一下什麼是函數模闆?
函數模闆是C++模闆機制中的一種,主要的目标是将函數的資料類型和邏輯代碼相分離,進而實作代碼的高度複用。函數模闆也可以了解為是一種通用函數,這個通用函數的參數和傳回值的資料類型可以不必具體指定,而是用一個假設的類型來表示,隻有當函數模闆執行個體化的時候,才會用具體的資料類型來代替這個假設的資料類型。
下面,我們來看一下,在C++中如何定義一個函數模闆?
函數模闆以關鍵字template開頭,其後是一對尖括号劃分的模闆參數清單。模闆參數清單中可以聲明多個模闆參數,多個參數聲明之間以逗号分隔。當我們調用它的時候和調用普通函數一樣,唯一的不同是需要在函數名後追加一對尖括号,并在尖括号中指定模闆函數的具體資料類型。下面,請讓我們來看一個例子,通過這個例子,幫助大家了解函數模闆的定義和使用方法。
例1 實作一個函數,在不同類型的數組中找到最大值。
函數功能:在數組中尋找最大值
函數參數:
input:數組首位址
nLen:數組長度
max:數組中的最大值,是一個輸出參數
函數傳回:成功傳回1,失敗傳回0
#include<stdio.h>
#include<stdlib.h>
template<typename T>
int max_element(T * input,int nLen, T & max)
{
if (!input)
{
return 0;
}
int i = 0;
max = input[0];
for (i = 1; i < nLen; i++)
{
if (max < input[i])
{
max = input[i];
}
}
return 1;
}
void main()
{
int nArray[5] = { 9, 6, 3, 8, 5 };
float fArray[5] = { 9.3, 8.2, 4.5, 1.6, 7.4 };
char cArray[5] = { 'a', 'c', 'g', 'e', 'h' };
int nMax = 0;
float fMax = 0.0f;
char cMax = 0;
if (!max_element<int>(nArray, 5, nMax))
{
printf("求最大值失敗.\n");
}
else
{
printf("整數數組中的最大值:%d\n", nMax);
}
if (!max_element<float>(fArray, 5, fMax))
{
printf("求最大值失敗.\n");
}
else
{
printf("浮點數組中的最大值:%.2f\n", fMax);
}
if (!max_element<char>(cArray, 5, cMax))
{
printf("求最大值失敗.\n");
}
else
{
printf("字元數組中的最大值:%c\n", cMax);
}
return;
}
運作效果如下:
例1中定義了一個函數模闆max_element,它的形參中input和max的資料類型并沒有具體指定,而是用一個假設的虛拟資料類型T來表示,當我們在main函數中調用它的時候,需要在模闆函數名後追加一對尖括号,在尖括号中為函數模闆制定具體的資料類型,比如,在我們的例子中,先後分别指定了int,float,char,這樣這三個模闆函數就會被具現為3個函數,這3個函數的參數類型先後分别是int,float,char。
在例1中,我們講解了如何定義一個函數模闆,以及如何使用它,但是它的模闆參數隻有1個,這樣很有可能會讓很多讀者誤會為函數模闆的參數隻能有1個,其實,不是這樣的。下面我們就來舉個例子,告訴大家如何定義一個具有多個模闆參數的函數模闆。
例2 定義一個函數模闆,列印函數參數類型尺寸的最大值。
函數功能:列印函數參數類型尺寸的最大值
input1:參數1,随便指定一個值就可以,隻要它是T1類型
input2:參數2,随便指定一個值就可以,隻要它是T2類型
input3:參數3,随便指定一個值就可以,隻要它是T3類型
函數傳回:傳回參數類型尺寸的最大值
#include<stdio.h>
#include<stdlib.h>
template<typename T1,typename T2,typename T3>
int max_type_size(T1 input1, T2 input2, T3 input3)
{
int nSize = sizeof(input1);
if (nSize < sizeof(input2))
{
nSize = sizeof(input2);
}
if (nSize < sizeof(input3))
{
nSize = sizeof(input3);
}
return nSize;
}
void main()
{
int nMaxSize = 0;
nMaxSize = max_type_size<char, int, double>('1', 1, 1.0);
printf("參數類型最大尺寸為:%d\n", nMaxSize);
return;
}
在例2中,我們定義了一個函數模闆max_type_size,它有3個模闆參數,當我們調用它的時候,會計算出這3個模闆參數類型的最大值。
需要注意的一點是:T2和T3前面的typename不能省略,否則會編譯錯誤。
今天,我們主要講解了如何定義和使用函數模闆,并舉了2個例子,通過例子告訴大家如何定義單個模闆參數和多個模闆參數的函數模闆以及需要注意的事項。