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