模板Template

来源:互联网 发布:历年双十一数据统计 编辑:程序博客网 时间:2024/05/01 12:09

模板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;        }    }};



原创粉丝点击