C++之函數模板(一)

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);				//自動類型推導

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章