天天看點

模闆程式設計中的技巧

關鍵字 typename

在C++标準化過程中,引入關鍵字typename是為了說明;模闆内部的辨別符可以是一個類型。譬如下面的例子:

  上面的程式中,第2個typename被用來說明:SubType是定義與類T内部的一種類型。是以,ptr是一個指向T::SubType類型的指針。

  如果不使用typename,SubType就會被認為是一個靜态成員,那麼它應該是一個具體的變量或對象,于是,下面表達式:

T::SubType *ptr;

  會被看作是類T的靜态成員SubType和ptr的乘積。

.template構造

我們在引入typename之後,發現了一個很相似的問題。考慮下面這個使用标準bitset類型的例子:

  本例中有一個奇怪的構造:.template。如果沒有使用這個template,編譯器将不知道下列事實:bs.template後面的小于号(<)并不是數學中的小于号,而是模闆實參清單的起始符号;那麼隻有在編輯器判斷小于号(<)之前,存在依賴于模闆參數的構造,才會出現這種問題。在這個例子中,傳入參數bs就是依賴于模闆參數N的構造。

使用this->

  對于基類的類模闆,自身使用名稱x并不一定等同于this->x。即使該x從基類繼承獲得的,也是如此。例如:

  在這個例子中,在foo()内部決定要調用哪一個exit()時,并不會考慮基類Base中定義的exit()。是以,你如果不是獲得一個錯誤,就是調用了另一個exit()。

  注意:對于那些在基類中聲明,并且依賴于模闆參數的符号(函數或者變量等),你應該在它們前面使用this->或者Base<T>::。如果希望完全避免不确定性,你可以(使用諸如this->和Base<T>::等)限定(模闆中)所有的成員通路。

繼續閱讀