c++隨筆,關於模板的第二個小記 16.1.3模板參數

16.1.3模板參數

很多時候我們把參數名字定義爲T,但是實際上我們可以使用任何的名字

比如

template <typename DATA>using partNo = BlobA<DATA>;

模板參數和作用域規則。一個模板參數名的可用範圍是在其聲明之後,至模板聲明或定義結束之前。與其他任何名字都一樣,模板參數會隱藏外層作用域中聲明的相同的名字。但是,與大多數其他上下文相同,在模板內不能重用模板參數名:

typedef double A;
template <typename A,typename B>void f(A a,B b)
{
    A tmp = a;
    double B;//錯誤重複聲明模板參數B
}

因爲上面已經聲明過B 了 typename B,下面又聲明瞭B
同時也要注意temp 的類型 不是 double 了 ,是模板的實參類型

模板聲明:

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

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

與函數一樣,聲明中的模板名字,不一定要和定義的時候相同

template <typename T> T calc(const T&,const T&);
template <typename U> U calc(const U&,const U&);

比如說這兩個模板函數其實就是一樣的這麼寫會出現重複定義

使用類的類型成員

比如說我們可以使用string::size_type ,我們知道string類型,但是對於模板T::mem來說,卻不知道T的類型

默認情況下,c++語言假定通過作用域運算符訪問的名字不是類型。因此如果我們希望使用一個模板類型參數的類型成員,就必須顯示的告訴編譯器該名字是一個類型。我們通過使用typename來實現這一點。

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

我們的top函數期待一個容器類型的實參,它使用typename指明返回類型並且在c中沒有元素時候生成一個值初始化的元素返回給調用者。

然後我們看代碼

int main()
{
    int b;
    std::vector<int> vec;
    top(vec);
//    std::cout<<partNo<int>::count()<<std::endl;
    return 0;
}

如果傳入 vec這是正確的 如果傳入 a 因爲是int所以是錯誤的這全都歸功與我們提前告知了編譯器

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