C++ 速查手冊

10.2 - 類別樣板

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

舉例如下

#include <iostream>
  
template <typename T> class Demo {
public:
    Demo(const T& a, const T& b) {
        this->a = a;
        this->b = b;
    }
    
    T do_something() {
        return a + b;
    }
    
private:
    T a;
    T b;
};

int main() {
    Demo<int> d1(20, 25);
    std::cout << d1.do_something() << std::endl;
    Demo<double> d2(5.2, 3.95);
    std::cout << d2.do_something() << std::endl;
    Demo<char> d3('1''2');
    std::cout << d3.do_something() << std::endl;
    
    return 0;
}

/* 《程式語言教學誌》的範例程式
   http://kaiching.org/
   檔名:u1002.cpp
   功能:示範 C++ 的樣板
   作者:張凱慶*/

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

template <typename T> class Demo {
public:
    Demo(const T& a, const T& b) {
        this->a = a;
        this->b = b;
    }
    
    T do_something() {
        return a + b;
    }
    
private:
    T a;
    T b;
};

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

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

Demo<int> d1(20, 25);
std::cout << d1.do_something() << std::endl;
Demo<double> d2(5.2, 3.95);
std::cout << d2.do_something() << std::endl;
Demo<char> d3('1''2');
std::cout << d3.do_something() << std::endl;

編譯執行,結果如下

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

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

相關教學影片

上一頁 10.1 - 函數樣板
回 C++ 速查手冊首頁
下一頁 10.3 - 樣板別名
回 C++ 教材
回程式語言教材首頁