泛型編程:
C++中一種使用模板來實現代碼重用和類型安全的編程范式。它允許程序員編寫與數據類型無關的代碼,從而可以用相同的代碼邏輯處理不同的數據類型。模板是泛型編程的基礎
模板分為兩類:
-
函數模板:代表了一個函數家族,該函數模板與類型無關,在使用時被參數化,根據實參類型產生 函數的特定類型版本
-
類模板
函數模板:
代表了一個函數家族,該函數模板與類型無關,在使用時被參數化,根據實參類型產生 函數的特定類型版本
提供一個函數的模板,但是類型是不固定的,對于這種編程也叫泛型編程
Template<typename T1, typename T2,......,typename Tn>//模板格式template<typename T>//T是一個類型的名稱,沒有要求;typename是一個關鍵字,后面跟的是泛型類型的名字,typename也能換成class。typename T合起來就是一個模板參數
void Swap(T& left,T& right)
{T temp = left;left = right;right = temp;
}
template<typename T>
void Swap(T& left,T& right)
{T temp = left;left = right;right = temp;
}
int main()
{int x = 1, y = 2;double m = 1.1, n = 2.2;Swap(x,y);//這里兩處函數調用,看似調用的是一個函數,但實際上時調用了兩個函數(函數調用要建立棧幀,一個是int類型,一個double類型,類型大小都不一樣,更不可能調用的是同一個函數了),這個可以從匯編層來觀察Swap(m,n);return 0;
}
觀察匯編代碼發現,call的地址不一樣,說明調用的不是同一個函數。
原理:
編譯器通過你編寫的模板,再根據你傳入的參數,自行生成對應的函數,調用的就是這個編譯器自行生成的函數
如果你傳入兩個參數,這兩個參數的類型不一樣,就需要寫兩個模板參數,否則編譯會不通過
正確做法如下:
template<typename T1, typename T2>
void Swap(T1&left,T2&right)
{T1 temp = left;left = right;right = temp;
}
int main()
{int x = 1, y = 2;double m = 1.1, n = 2.2;Swap(x,n);Swap(m,y);return 0;
}