模板參數
模板參數與作用域
- 模板參數會隱藏外層作用域中聲明的相同名字
- 在模板內不能重用模板參數名
- 一個模板參數名在一個特定的模板參數列表中只能出現一次
模板聲明
- 模板聲明必須包括模板參數,不能有類型
- 模板聲明中模板參數的名字不必與定義中的相同
使用類的類型成員
- 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;
}
}