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 可加快編譯過程。
相關教學影片