如何定义函数模板
大家好,上次我們講了模板編程的好處,它的好處主要是實現數據類型和邏輯代碼相分離,從而實現代碼的高度復用。這次,我們就來看一下如何在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("求最大值失敗.
");
}
else
{
printf("整數數組中的最大值:%d
", nMax);
}
if (!max_element<float>(fArray, 5, fMax))
{
printf("求最大值失敗.
");
}
else
{
printf("浮點數組中的最大值:%.2f
", fMax);
}
if (!max_element<char>(cArray, 5, cMax))
{
printf("求最大值失敗.
");
}
else
{
printf("字符數組中的最大值:%c
", 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
", nMaxSize);
return;
}
運行效果如下:
在例2中,我們定義了一個函數模板max_type_size,它有3個模板參數,當我們調用它的時候,會計算出這3個模板參數類型的最大值。
需要注意的一點是:T2和T3前面的typename不能省略,否則會編譯錯誤。
今天,我們主要講解了如何定義和使用函數模板,并舉了2個例子,通過例子告訴大家如何定義單個模板參數和多個模板參數的函數模板以及需要注意的事項。
總結
- 上一篇: 生态板的材质是什么?生态板环保吗?
- 下一篇: 海竿组装图解(海竿的线组搭配图解)