C++是一門非常強大,非常複雜,非常龐大的語言。C++本身從C語言發展而來,它一開始就具備了面向過程編程和麪向對象編程這兩種編程範式(編程風格,其實就是程序設計的不同哲學理念)。後來隨着C++的逐步發展,它支持了泛型編程。本文將要介紹的函數模板就是泛型編程的程序設計理念。再後來C++有了模板元編程,這本質上就是函數式編程。在C++11標準中又引進了lambda表達式。到此爲止,C++已經變得非常複雜,非常龐大,同時也非常強大。我不太瞭解函數式編程的設計理念是什麼。從百度百科的介紹來看,應該是函數作爲程序設計的第一位。C++本身並不提倡使用函數式編程風格。
C++是一門古老而又年輕的語言,它一直在隨着時代不斷變化,充滿着活力。
函數模板
函數模板是想實現數據類型的模糊,使得多種數據類型都支持的某種操作用一個函數來實現,從而實現代碼的複用,泛用。這就是泛型編程的設計理念。泛型編程能大大幫助我們偷懶,大家都想少寫一些代碼,實現的功能卻沒有變少。
大家都寫過交換兩個變量的函數,它們可能長成下面這個樣子。
void swap(int& a, int& b) //交換兩個int變量
{
if (a != b)
{
a = a ^ b;
b = a ^ b;
a = a ^ b;
}
}
void swap(double& a, double& b) //交換兩個double變量
{
if (a != b)
{
a = a + b;
b = a - b;
a = a - b;
}
}
void swap(char& a, char& b) //交換兩個字符
{
char c = a;
a = b;
b = c;
}
雖然都是交換,但是由於數據類型的不同,我們只能寫三個重載函數來實現交換。大家都想偷個懶,少寫點。也就有了泛型編程設計理念。
函數模板就是實現泛型編程設計理念的工具之一。函數模板能大大提高代碼的複用性。
函數模板的形式如下:
template<typename 模板名1,...,typename 模板名n>
函數返回值 函數名 (模板名1 a,...,模板名n n)
{
函數體
}
-
其中typename這個關鍵字可以使用class這個關鍵字來替換。
-
函數模板只對緊跟其後的第一個函數作用。
-
模板名1和模板名2在函數被調用後都表示一個具體的數據類型。
-
需要用到幾種類型,就聲明幾個模板名。
-
泛型也運用了一種多態的方式(靜態多態)。
交換兩個變量,首先這兩個變量肯定是相同類型的,因此我們只需要一個模板名就夠了。所以被實現的通用代碼如下:
template<typename T>
void swap(T a, T b)
{
T tmp = a;
b = a;
a = tmp;
}
一般這樣的簡單的函數,我們還會將其聲明爲內聯函數。如下:
template<typename T>
inline void swap(T a, T b)
{
T tmp = a;
b = a;
a = tmp;
}
這樣就大大簡化了代碼。
關於調用函數模板,這和普通的函數調用稍有不同。我們可以顯式調用,也可以讓它進行自動類型推導。這個自動類型在複雜類型的時候不太好用。因此一般我們都是使用顯示類型調用。如下所示:
swap<char>(a, b); //顯式調用
swap(i, j); //自動類型推導
swap(x, y); //自動類型推導