现在的位置: 首页 > 综合 > 正文

模板Template

2017年12月24日 ⁄ 综合 ⁄ 共 1361字 ⁄ 字号 评论关闭

模板Template)指C++程序设计语言中的函数模板类別模板,大体对应于javaC#中的泛型。目前,模板已经成为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;
        }
    }
};


【上篇】
【下篇】

抱歉!评论已关闭.