《C++ Templates》 函式模板與類模板初探
阿新 • • 發佈:2020-11-25
本章主要針對於函式模板做一個初步的總結,補全了一些C++ Prime上缺失的問題;
函式實參型別轉換問題:
在指定模板型別之後,例項化如果型別出現不符合,會進行報錯,所以特定場合需要進行型別轉換:
#include<iostream> #include<stdio.h> #include<string> using namespace std; template <typename T> inline const T& rmax(const T& a, const T& b) { if (a > b) return a; else return b; } template <typename T, typename U> inline const T& rmax(const T& a, const U& b) { cout << a << endl << b << endl; if (a > b) return a; else return b; } int main() { cout << rmax(1, 2) << endl; //通過直接顯式指定ramx得type為int,直接進行顯示轉換; cout << rmax<int>(1, 2.2) << endl; //使用static_cast來進行轉換 cout << rmax(static_cast<double>(4), 2.2)<<endl; //使用多個模板引數來進行定義; cout << rmax(22.22, 4) << endl; system("pause"); return 0; }
上述給出了三種最常見的轉換方法:
1.使用static_cast進行強制型別轉換;
2.使用顯示指定type得型別進行轉換;
3.使用多引數模板進行轉換;
類模板特化問題:
C++ prime上並沒有很清晰的講解特化問題,這本書做了一個比較基礎的介紹;
特化的意義:旨在指定一些引數,使得用處比較廣泛的模板變成一些特定引數匹配的模板,有助於某一功能得更好實現;
但是注意:模板的特化只能針對於類模板,而不能針對於函式模板;
特化主要分為三類:
1.全特化;
2.區域性特化(網上又稱為偏特化);
3.不特化(即最原始的模板寫法);
不特化:
即最簡單的模板形式,各種模板型別匹配由實際例項化時讓程式設計師給出;
區域性特化:
對於多個模板引數,現實化的指定出一些引數型別,可以很好的用於模板匹配的情況;
template <typename T> class myclass<T, T> { //型別一 }; template <typename T> class myclass<T, int> { //型別二 }; template <typename T,typename U> class myclass <T*,U*>{ //型別三 };
上述可以清楚得看到三種類型的定義形式;
所以可以很直白的看到,區域性特化本質上就是擴充模板函式,相當於為了過載來進行更好的服務;
並且值得注意的是,在實際使用模板引數的時候,給出的個數往往是類名後面得引數個數,編譯器會根據最合適的模板進行例項化;
全特化:
對於全特化,這是區域性特化的升級模式,相當於直接指定類模板引數;
template <> class myclass<string, int> { };
可以很清晰的看到,實際上就是第一個引數列表直接為空,在類名後面的引數列表中給予指定;
預設模板實參問題:
可以通過預設模板實參方法來在不給定模板引數的情況下進行構造,也可以指定引數,來提高靈活性;
template <typename T, typename CONT = std::vector<T>> class stack { private: CONT elems; };
可以參照書上得分stack定義來看;
如果使用該定義形式可以將stack類內部管理的資料結構進行指定,也可以不指定,不指定直接視為針對於T的vector例項化;