C++模板詳細整理2

1 模板參數
和函數參數一樣,模板參數名字程序員自己定義。通常將類型參數命名爲 T 。但實際上我們可以使用任何名字。

template <typename FOO> FOO calc (const FOO& a,const FOO& b)
{
    FOO tmp = a;//tmp的類型與參數和返回類型一樣
    return 0;
} 

1.1**模板參數與作用域**
和普通函數一樣,模板參數名作用範圍是在其聲明之後,直到模板聲明或定義結束之前。模板內不能重用模板參數名。

1.2**模板聲明**
模板聲明必須包含模板參數

template <typename T>int compare(const T&, const T&);
template <typename T> class Blob;

與函數參數相同,聲明中的模板參數的名字不必與定義中的相同。

1.3使用類的類型成員
我們用作用域:: 來訪問static成員和類型成員,在普通非模板代碼中,編譯器直到類的定義。因此,他知道通過作用域運算符訪問的名字是類型還是static成員。
但對於模板就麻煩了。假設T是一個模板類型參數,當編譯器遇到類似 T::Compare這樣的代碼時候,他不知道compare是一個類型成員還是一個static數據成員,直到實例化才知道。
因此,我們必須顯式告訴編譯器該名字是一個類型。我們通過關鍵字typename來實現這一點。

template <typename T>
typename T::value_type top(const T& c)
{
    if(!c.empty())
        return 0;
    else 
    {
        return typename T::value_type();
    }
}

1.4 默認模板實參

就像我們爲函數參數提供默認實參一樣,我們也可以提供默認模板實參,在新標準裏,我們可以爲函數和類模板提供默認實參。

template <typename T,typename F = less<T> >
int compare(const T &v1, const T &v2,F f = F())
{
    if(f(v1,v2)) return -1;
    if(f(v2,v1)) return 1
    return 0;
}

在這段代碼中,我們爲模板添加了第二個類型參數,名爲F,表示可調用對象的類型。並定義了一個新的函數參數f,綁定到一個可調用對象上。
1.5 成員模板
一個類,可以包含本身是模板的成員函數,這個成員被稱爲成員模板,當然,成員模板不能是虛函數。
普通類的成員模板

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章