C++primer 閱讀筆記-模板與泛型編程(模板參數)

模板參數

模板參數與作用域

  • 模板參數會隱藏外層作用域中聲明的相同名字
  • 在模板內不能重用模板參數名
  • 一個模板參數名在一個特定的模板參數列表中只能出現一次

模板聲明

  • 模板聲明必須包括模板參數,不能有類型
  • 模板聲明中模板參數的名字不必與定義中的相同

使用類的類型成員

  • C++假定通過作用域運算符訪問的名字不是類型
  • 關鍵字typename顯示告訴編譯器該名字是類型
template<typename T>
//由於不知道T的類型,T::value_type可能是一個static數據也可能是一個類型,typename顯式說明其爲類型
    typename T::value_type top(const T& c){
        if (!c.empty()) 
            return c.back();
        else
            return typename T::value_type();    
    }

默認模板實參

  • 默認使用標準庫的less函數對象模板進行比較
  • 爲此模板參數提供了默認實參
  • 爲其對應的函數參數提供了默認實參
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,綁定到一個可調用對象上
  • 實例化compair:
    bool j = compare(item1,item2,compareIsbn);
  • compareIsbn必須是可調用對象,其返回值必須能轉換爲bool,接受實參類型必須與item1、item2類型兼容

模板默認實參與類模板

  • 在使用一個類模板時必須在模板名後接上尖括號
  • 在使用類模板的默認實參時,帶空尖括號對
template<typename T = int > class numbers
{
    public:
        numbers(T v = 0):val(v){}
    pricate:
        T val;
};
//用默認模板實參實例化類對象
numbers<> average;

習題

  • 編寫函數,接受一個容器的引用,打印容器中的元素。使用容器的size_type和size成員控制打印元素的循環
#include "stdafx.h"
#include <vector>
#include <iostream>

using namespace std;
template<typename T>
void myvec1(vector<T>& vec){
    typename vector<T>::size_type i = 0;
    for (;i < vec.size();i++)
    {
        cout << vec[i] << endl;
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    int a[] = {1,2,3,4,5,6,7,8};
    vector<int> vec(a,a+8);
    myvec1(vec);
    return 0;
}
  • 使用begin和end返回的迭代器來控制循環重新編寫上題
void myvec2(vector<T>& vec){
    for (vector<T>::iterator beg = vec.begin();beg != vec.end();beg++)
    {
        cout << *beg << endl;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章