C++ Templates讀書筆記< 一 > 函數模版
* 並不是把模板編譯成一個可以處理任何類型的單一實體,而是對於執行個體化模板參數的沒種類型,都從模板產生出一個不同的實體。* 具體類型代替模板參數的過程,叫做“執行個體化”* 模板被編譯了兩次:1。 執行個體化之前,檢查模板本身的文法2。 執行個體化期間,察看是否所有的調用都有效* 函數模板內部,不能制定預設的模板實參(類模板可以)。* 函數模板的實參演繹:調用參數的類型構造自模板參數,所以模板參數和調用參數通常是相關的。 模板實參演繹並不適合傳回型別。* eg: 1 template< typename T1, typename T2 >
2 inline T1 max( T1 const& a, T2 const& b )
3 {
4 return a < b ? b : a;
5 }註:傳回型別不能是引用。因為若返回T2類型實參,則T2需要轉為T1,這個過程將會建立一個新的局部臨時變數。* 重載函數模版:a> 一個非模板函數可以和一個同名的模版函數同時存在,並且該模板函數還可以被執行個體化為這個非模板函數。b> 模板不允許自動類型轉換,但普通非模板函數可以。eg: 1 inline int const& max( int const& a, int const& b )
2 {
3 return a < b ? b : a;
4 }
5
6 template< typename T >
7 inline T const& max( T const& a, T const& b )
8 {
9 return a < b ? b : a;
10 }
11
12 max( 7.0, 42.0 ); // 調用max<double>
13 max( 'a', 'b' ); // 調用max<char>
14 max( 7, 42 ); // 調用int重載的非函數模板
15 max<>( 7, 42 ); // 調用max<int> 上述 a>
16 max<double>( 7, 42 ); // 調用max<double> 沒有實參演繹
17 max< 'a', 42.7 >; // 調用int重載的非函數模板 上述 b>c> 函數的所有重載版本的聲明都應該位於函數被調用的位置之前
著作權聲明:本篇為原創文章,允許轉載,但轉載時請務必以超連結形式標明文章的原始出處和作者資訊。請尊重本人的勞動成果,謝謝!
小祥的BLOG http://xfxsworld.cnblogs.com