C++編程語言是一個功能強大的計算機應用語言,它的出現在一定程度上大大降低了開發人員的負擔,提高了開發效率。我們在這裡先來了解一下C++模板參數的相關概念。簡單的說,可以把模板看作一種類型,函數模板也不例外。
既然是類型,那麼我們在使用模板函數的時候就應該是使用它的一個實例。既然是類型與實例的關系,那麼就應該有一個類型的實例化的問題。我們對普通類型進行實例化的時候通常需要提供必要的參數以,模板函數也不例外。只是C++模板參數不是普通的參數,而是特定的類型。也就是說在實例化一個函數模板的時候需要以類型作為參數。通常,模板的參數分為模板參數和調用參數。例如:
- template <typename T1, typename T2, typename RT>
- inline RT const& max(T1 const& a, T2 const& b)
- {
- //TODO: 代碼實現
- ........
- }
其中,第一行定義了函數模板參數;第二行的函數參數則定義了調用參數,需要注意的是返回值並不屬於函數模板的調用參數。
在調用一個模板的時候,最重要的是在調用的時候能正確的推導出C++模板參數。這裡有幾點要注意的:
1:顯示的實例化函數模板。例如:
- template <typename T>
- inline T const& max(T const& a, T const& b)
- {
- return a < b ? b : a;
- }
- // 實例化並調用一個模板
- max<double>(4, 4.2);
第十行,通過顯示的指定C++模板參數為double而實例化了一個模板。
2:隱式的實例化一個函數模板。例如:
- template <typename T>
- inline T const& max(T const& a, T const& b)
- {
- return a < b ? b : a;
- }
- // 隱式的實例化並調用一個函數模板
- int i = max(42, 66);
第8行,我們沒有顯示的指定函數模板參數,但它能自動的去推導出函數模板參數為int。這裡可能有個問題。如果非模板函數它的定義和推導後的模板函數實例一樣,會產生什麼結果呢?例如:
- inline int const& max(int const& a, int const& b)
- {
- // 為了便於區分,讓返回結果+100
- return a < b ? a+10 : b+100;
- }
- template <typename T>
- inline T const& max(T const& a, T const& b)
- {
- return a < b ? b : a;
- }
- // 這裡調用的究竟是模板函數還是非模板函數?
- int i = max(42, 66);
實際上,第14行的代碼首先回去查看是否有滿足要求的非模板函數;如果沒有,再根據參數去匹配並實例化相應的模板函數。所以,它調用的應該是非模板的max函數。
3: 也可以使用部分缺省的C++模板參數。你不用指定全部的模板參數,比如,你可以從左到右的,指定一部分參數。例如:
- // 從左至右定義了三個參數
- template <typename RT, typename T1, typename T2>
- inline RT const& max(T1 const& a, T2 const& b)
- {
- //TODO: 代碼實現
- ..
- }
- // 可以只指定第一個返回參數。即,要求返回double類型
- max<double>(4, 4.2);
上面的代碼中,由於返回參數類型不屬於調用參數,所以必須明確的指定它為double類型。而T1和T2屬於調用C++模板參數,能從函數調用中推導出來。