c++模板

1.泛型編程
問題提出:怎麼編寫一個通用的交換函數呢?
泛型編程:編寫與類型無關的通用代碼,是代碼複用的一種手段。模板是泛型編程的基礎。

2.函數模板
函數模板代表了一個函數家族,該函數模板與類型無關,在使用時被參數化,根據實參類型產生函數的特定類型版本。

template<typename T>
void Swap(T& left, T& right)
{
	T temp = left;
	left = right;
	right = temp;
}

注意typename是用來定義模板參數關鍵字,也可以使用class,但不能用struct代替class
在編譯器編譯階段,對於模板函數的使用,**編譯器需要根據傳入的實參類型來推演生成對應類型的函數以供調用。**比如:當用double類型使用函數模板時,編譯器通過對實參類型的推演,將T確定爲double類型,然後產生一份專門處理double類型的代碼。

函數模板實例化
用不同類型的參數使用函數模板時,稱爲函數模板的實例化。
模板參數實例化分爲:隱式實例化和顯示實例化。

1.隱式實例化:讓編譯器根據實參推演模板參數的實際類型

T add(const T& left,const T& right)
{
	return left + right;
}


int main()
{
	int a1 = 10, a2 = 20;
	double d1 = 10.0, d2 = 20.0;
	add(a1, a2);
	add(d1, d2);`在這裏插入代碼片`

	/*
	add(a1,d1);
	該語句不能通過編譯,因爲在編譯期間,當編譯器看到該實例化時,需要推演其實參類型,通過實參a1將T推演爲int,通過實參
	d1將T推演爲double類型,但模板參數列表中只有一個T。編譯器無法確定此處到底將T確定爲int或是double而報錯
	*/

	add(a1, (int)d1);
	return 0;
}

2.顯示實例化:在函數名後的<>中指定模板參數的實際類型!!

T add(const T& left,const T& right)
{
	return left + right;
}
int main()
{
	int a1 = 2, a2 = 3;
	double b1 = 3.3;
	add<int>(a1, b1);//顯示實例化
	return 0;
}

模板參數的匹配原則
1.一個非模板函數可以和一個同名的函數模板同時存在,而且該函數模板還可以被實例化爲這個非模板函數。
2.對於非模板函數和同名函數模板,如果其他條件都相同,在調動會優先調用非模板函數而不會從該模板產生一個實例。如果模板可以產生一個更好匹配的函數,那麼將選擇模板。
3.模板函數不允許自動類型轉換,但普通函數可以進行自動類型轉換。

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