模板(Template)指C++程序设计语言中的函数模板与类別模板,大体对应于java和C#中的泛型。目前,模板已经成为C++的泛型编程中不可缺少的一部分。
模板定义以关键字template开始,后接模板形参表,模板形参表是用尖括号括住的一个或者多个模板形参的列表,形参之间以逗号分隔。 模板形参可以是表示类型的类型形参,也可以是表示常量表达式的非类型形参。非类型形参跟在类型说明符之后声明。类型形参跟在关键字class或typename之后定义。
模板是C++程式員絕佳的武器, 特別是結合了多重繼承(multiple inheritance)與運算子重載(operator overloading)之後。C++ 的標準函式庫提供許多有用的函式大多結合了模板的觀念,如STL以及IO Stream。
函数模板
以下以取最大值的函数模板maximum為例。此函數在編譯時會自動產生對應輸入變數的資料類別的實際程式碼。
#include <iostream> template <typename T> inline const T& maximum(const T& x,const T& y) { if(y > x) return y; else return x; } int main(void) { using namespace std; //Calling template function std::cout << maximum<int>(3,7) << std::endl; //输出 7 std::cout << maximum(3, 7) << std::endl; //和上面相同 std::cout << maximum<double>(3.0,7.0) << std::endl; //输出 7 return 0; }
类別模板
-
以下以將元件指標的操作,封裝成类別模板ComPtr為例。
#pragma once template <typename Ty> class ComPtr { protected: Ty* m_ptr; public: ComPtr() { m_ptr = NULL; } ComPtr(const ComPtr& rhs) { m_ptr = NULL; SetComPtr(rhs.m_ptr); } ComPtr(Ty* p) { m_ptr = NULL; SetComPtr(p); } ~ComPtr() { Release(); } const ComPtr& operator=(const ComPtr& rhs) { SetComPtr(rhs.m_ptr); return *this; } Ty* operator=(Ty* p) { SetComPtr(p); return p; } operator Ty* () { return m_ptr; } Ty* operator->() { return m_ptr; } operator Ty** () { Release(); return &m_ptr; } operator void** () { Release(); return (void**)&m_ptr; } bool IsEmpty() { return (m_ptr == NULL); } void SetComPtr(Ty* p) { Release(); m_ptr = p; if (m_ptr) { m_ptr->AddRef(); } } void Release() { if (m_ptr) { m_ptr->Release(); m_ptr = NULL; } } };