C++模板重載
文章轉自 公眾號:Coder梁(ID:Coder_LT)
1.重載模板
函數模板可以使得同一個函數對不同類型使用,非常地方便。但有的時候類型不同,隻是通過模板是沒辦法解決的, 可能邏輯上也會有所區別,這個時候隻是使用模板是無法解決的。
為瞭滿足這種需求,我們可以像是重載函數那樣重載模板。和常規的函數一樣,重載的模板的函數特征,也就是入參的數量和類型必須有所不同。
舉個例子:比如我們之前定義瞭一個函數模板用來交換兩個變量的值。如果我們要交換的不隻是變量,而是兩個數組,就必須要修改邏輯瞭。
template <typename T> void Swap(T &a, T &b); template <typename T> void Swap(T *a, T *b, int n);
可以看到我們額外傳入瞭一個int n
,它表示數組的長度。另外,我們入參的類型也發生瞭變化,不再是模板類型T的引用,而是指針瞭。因為我們要接收的是一個數組,而數組在函數傳遞當中都是以指針的形式進行的。所以這裡要寫成指針,當然也可以寫成這樣:T a[],兩種形式本質上沒有區別。
所以我們實現的話會是這樣:
template <typename T> void Swap(T &a, T &b) { T temp = a; a = b; b = temp; } template <typename T> void Swap(T *a, T *b, int n) { for (int i = 0; i < n; i++) { Swap(a[i], b[i]); } }
2.問題
到這裡,相信大傢也能看出一點問題。
假設我們有這樣一個模板函數:
template <typename T> void Swap(T a, T b);
雖然理論上類型T是萬能類型,什麼類型都可以接受。但我們操作的時候會有很多問題,比如我們執行a = b
,對於數組類型就會報錯。
再比如我們執行a > b
,很多類型也無法進行比較大小。再比如進行算術運算等等,很多類型比如指針、數組或者結構體也沒辦法進行算術運算。
總之模板的功能是很局限的,有的時候隻能處理某些類型,很難通用覆蓋所有情況。當然有的時候也是有一些其他辦法繞開的,比如結構體也可以重載比較運算符,也可以重載一些算術運算符等等。
到此這篇關於C++模板重載的文章就介紹到這瞭,更多相關C++模板重載內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!