類別樣版 (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 ...
沒有留言:
張貼留言