C++ 速查手冊 V1.00 - 單元 10.2 - 類別樣板




類別樣版 (class template) 可定義適用多種型態的類別,而不需要多載適用各種情況的成員函數。


舉例如下


001 #include <iostream>
002
003 template <typename T> class Demo {
004 public:
005    Demo(const T& a, const T& b) {
006       this->a = a;
007       this->b = b;
008    } 
009
010    T do_something() {
011       return a + b;
012    }
013     
014 private:
015    T a;
016    T b;
017 };
018
019 int main() {
020    Demo<int> d1(20, 25);
021    std::cout << d1.do_something()
022              << std::endl;
023    Demo<double> d2(5.2, 3.95);
024    std::cout << d2.do_something()
025              << std::endl;
026    Demo<char> d3('1''2');
027    std::cout << d3.do_something()
028              << std::endl;
029
030    return 0;
031 }
032
033 /* Kaiching Chang 
034    u1002.cpp
035    2014-02 */

第 3 行定義類別樣版使用關鍵字 template 宣告


003 template <typename T> class Demo {
004 public:
005    Demo(const T& a, const T& b) {
006       this->a = a;
007       this->b = b;
008    } 
009
010    T do_something() {
011       return a + b;
012    }
013     
014 private:
015    T a;
016    T b;
017 };

角括號圍起來的地方是樣版參數列 (parameter list) ,使用 typename 宣告所用的型態名稱,底下成員函數的參數要用 const 參考。簡單說,就是把類別定義換成用樣板來寫。


使用類別樣版宣告變數,要用角括弧宣告 T 的實際型態


020 Demo<int> d1(20, 25);
021 std::cout << d1.do_something()
022           << std::endl;
023 Demo<double> d2(5.2, 3.95);
024 std::cout << d2.do_something()
025           << std::endl;
026 Demo<char> d3('1''2');
027 std::cout << d3.do_something()
028           << std::endl;

編譯執行,結果如下


$ g++ u1002.cpp
$ ./a.out
45
9.15
c
$

修飾詞 export 到 C++11 不再支援,而 C++11 新增 extern 可加快編譯過程。

continue ...

沒有留言: