2018年9月20日 星期四

C++ 的樣板(template)

    在 c++ 使用 template 接角括號 < > 緊接著類型及輸入參數, 例如:
               template <class T>  
               T functionName (T passthrough) { 
                     return passthrough; 
                }
               template <class T>
               class  className {
                        // ...
               };

當樣板作用在一般函式上時, 就是把該函式當樣本(函式樣板), 如果作用在類型身上, 等於把整個類型當樣本(類型樣板), 在樣板角括號 < > 裏面, 很像是函式小括號 ( ) 的輸入參數的宣告方式, 在程式裡引用時也跟函式 ( ) 呼叫(invoke)的方式非常類似, 只不過用角括號 < > 作出區別並傳遞參數, 因此可以把它當成樣板函式. 樣板函式的通用型輸入參數(generic type) 使用 class 或 typename 來宣告範本識別字, 例如 <class T> 其它類型(int, long, float ...)就跟變數的宣告方式沒兩樣, 例如 <long  L, float F>
     在程式碼呼叫(invoke)樣板函式: 函式名稱 < >( ) 時, 其實是由編譯器(compiler)事前將函式的輸出入類型由樣板函式的角括號 < > 內的輸入類型先加以取代, 之後才編譯程式碼. 因此有了樣板函式, 編譯器可以針對不同輸出入參數的類型自動產生程式碼(函式), 免去重複編寫的煩瑣問題.
     #include  <iostream>
     using namespace std;
     template <class T> 
// 啟用通用型樣板符號 T, 緊跟著樣板函式
     T  f(T  in){ // 把 f 函式當樣板使用, 輸入參數是 T  in, T 是 type, in 是輸入變數
          return in; // passthrough
      }
      int main( ) {
          cout << f <const char*>("Hello\n"); //呼叫樣板函式傳字串: f<type> (variable)
       cout <<   f
<float> (3.14159); //呼叫樣板函式傳浮點數:f<type> (variable)
        cout <<   f
<const char*> ("\n"); //呼叫樣板函式傳字串: f<type> (variable)
           cout <<   f
<int> (3);  // 呼叫樣板函式傳整數: f<type> (variable)
        cout <<   f
<const char*> ("\n"); // 呼叫樣板函式傳字串: f<type> (variable)
      }
使用 template < > 有幾個重要觀念要建立:
1. 他是編譯器用的程式碼範本(或樣本)
2. 樣板函式的角括號  < > 傳遞的是輸出入的類型(type)參數, 一般函式 ( ) 傳遞的參數只有輸入變數
3. 呼叫樣板函數要同時用 <type> (variable)  分別傳遞兩種參數
當使用樣板函式時, 程式碼可能會變得難以閱讀, 因此初學者應熟悉之後才運用

1 則留言:

trustno1 提到...

cplusplus编程样本供程序员使用
c ++字符串操作