模板初學者指南1 (轉)

worldblog發表於2007-12-12
模板初學者指南1 (轉)[@more@]

模板初學者指南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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章