模板初學者指南1 (轉)
模板初學者指南1
原文:">
:namespace prefix = o ns = "urn:schemas--com::office" />
在開發大型應用時,對於不同的和類,透過使用共享程式碼模板可以節省大量的時間。在通用的函式或是類中定義模板,模板是和資料相獨立的。在這個指南中,我將處理模板函式和模板類。假設你已經實現了一個類處理堆疊,有關push pop 讀狀態等操作,這個堆疊類可以處理double型別的數值。如果以後要求一個整型的堆疊類,哪怎麼辦?沒有模板技術,你不得不復制貼上這個堆疊類程式碼。這樣不高。使用模板,你可以定義模板類或是函式,使用所有的函式和型別, 可以在模板定義中宣告新的變數。看下面是怎麼工作的:
函式模板
假設我們需要一個函式模板為了在不同型別的陣列中查詢最小數值:
template < class ElemType >
ElemType calcmin(ElemType elemField[], int iFieldSize)
{
int iMin = 0;
for (int i=1; i < iFieldSize; ++i)
{
if (elemField[i] < elemField[iMin])
iMin = i;
}
return elemField[iMin];
}
這就是函式模板。他期待一個資料型別並將返回其中其中的一個。使用這個模板,看下面的例子:
void LetsTestTheFunctionTemplate()
{
int iField[] = {1,2,3,4,5,6};
double dField[] = {2.5, 2.31, 10.23, 15.2};
int iSize1 = sizeof(iField) / sizeof (int);
int i = calcmin(iField, iSize1);
int iSize2 = sizeof(dField) / sizeof(double);
double d = calcmin(dField, iSize2);
}
模板min被兩個不同的資料型別使用。一個是int[],另外是double[],但是函式的功能相同。查詢最小的並返回最小值。
函式模板還可以使用inline, extern static宣告。 注意要把這些放在template關鍵字和引數前面。如下:
template < class ElemType >
inline ElemType s(ElemType& a, ElemType& b);
類别範本
定義類别範本類似定義函式模板。看下面的例子,通用的stack類處理不同的型別。類原型定義如下:
template < typename ElemType, int iSize=100 >
class Stack
{
public:
Stack();
~Stack();
void push(const ElemType& anElement);
void pop(ElemType& anElement);
bool wasError() const;
bool isEmpty() const;
private:
ElemType elems[iSize];
int iTop;
bool bErrorOccd;
};
除了一些符號,這個類的實現與通常類的實現沒有很多差別。當定義了類别範本, 可以象普通類使用。但是你必須在中指定引數。在模板內,類名可以不帶引數使用。看下面類的實現:
// include your here or use a #define
template < class ElemType, int iSize >
Stack< ElemType, iSize >::Stack()
: iTop(0), bErrorOccd(false)
{
}
template < class ElemType, int iSize >
Stack< ElemType, iSize >::~Stack()
{
}
template < class ElemType, int iSize >
void Stack< ElemType, iSize >::push(const ElemType& anElement)
{
bErrorOccd = (iTop == iSize);
if (!bErrorOccd)
elems[iTop++] = anElement;
}
template < class ElemType, int iSize >
void Stack< ElemType, iSize >::pop(ElemType& anElement)
{
bErrorOccd = (iTop == 0);
if (!bErrorOccd)
anElement = elems[--iTop];
}
template < class ElemType, int iSize >
bool Stack< ElemType, iSize >::wasError() const
{
return bErrorOccd;
}
template < class ElemType, int iSize >
bool Stack< ElemType, iSize >::isEmpty() const
{
return (iTop==0);
}
使用類别範本如下:
Stack< int > iTheIntStack;
Stack< double, 30 > dTheDoubleStack;
待續:下面介紹高階函式模板。例如模板包含其他模板等其他。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-991624/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 模板初學者指南2 (轉)
- RMAN初學者指南(轉)
- JavaScript 模組(1):初學者指南JavaScript
- HTML初學者指南(九)(轉)HTML
- HTML初學者指南(七)(轉)HTML
- HTML初學者指南(六)(轉)HTML
- HTML初學者指南(四)(轉)HTML
- HTML初學者指南(三)(轉)HTML
- HTML初學者指南(二)(轉)HTML
- HTML初學者指南(一)(轉)HTML
- 初學者指南
- apache+mod_ssl初學者指南(轉)Apache
- Nginx初學者指南Nginx
- Groovy初學者指南
- RMAN 初學者指南
- Oracle初學者問題1(轉)Oracle
- 程式設計“初學者”入門指南 (轉)程式設計
- Linux初學者Patch使用指南(轉)Linux
- OAuth 2.0初學者指南OAuth
- Kotlin初學者指南Kotlin
- 【譯】GraphQL 初學者指南
- Apache Hudi初學者指南Apache
- 初學者 (轉)
- Java初學者入門指南Java
- 區塊鏈初學者指南區塊鏈
- Electron 的初學者詳細指南
- 給初學者的Web安全指南Web
- 5S管理--初學者指南
- 圖資料庫初學者指南資料庫
- 系統引導管理器grub初學者指南(轉)
- 【轉】Oracle初學者入門指南-什麼是Metalink -MOS ?Oracle
- React Redux 的初學者詳盡指南ReactRedux
- [譯] 網站優化初學者指南網站優化
- 自動機器學習和AI初學者指南機器學習AI
- 模糊測試: 初學者入門指南
- Pandas初學者程式碼優化指南優化
- 初學者的程式設計自學指南程式設計
- 初學者。aspx學習日記第1天---faq (轉)