C Templates 技巧性基礎知識

2021-05-25 18:57:31 字數 2137 閱讀 8007

關鍵字typename:

引入關鍵字typename是為了說明:模板內部的識別符號可以是乙個型別:

template

class myclass

.template構造:

void printbitset (std::bitsetconst& bs)

.template告訴編譯器.template後面的小於號是模板實參列表的起始符號。

使用this->:

對於那些在基類中宣告,並且依賴於模板引數的符號(函式或變數等),應該在它們前面使用this->或者base::。

如果希望完全避免不確定性,可以限定模板中所有的成員訪問。

成員模板和模板的模板引數:

通常,棧之間只有在型別完全相同時才能相互賦值,其中型別指的是元素的型別,即使這兩種元素的型別之間存在隱式型別轉換。『

函式模板不支援模板的模板引數。

不同型別間賦值的解決辦法(並加入模板的模板引數的完整版):

code:

#include 

#include 

#include 

template

template

class cont = std::deque> //模板的模板引數,其中類的兩個模板引數是為了匹配std::deque的兩個模板實參預設模板引數(元素型別和記憶體分配器allocator)

class stack   

//在元素不同的棧之間相互賦值的過載operator=

template

template

class cont2>  

stack& operator= (stackconst&);  

};  

template

class cont>  

void stack::push (t const& elem)  

template

class cont>  

void stack::pop ()  

elems.pop_back();         // remove last element

}  template

class cont>  

t stack::top () const

return elems.back();      // return copy of last element

}  //在元素不同的棧之間相互賦值的過載operator=

template

class cont>  

template

class cont2>  

stack& stack::operator= (stackconst& op2)  

stacktmp(op2);        // 建立乙份賦值棧的拷貝,以便使用top()和pop()從該拷貝中獲取元素。

elems.clear();                   // 移除現有元素

while (!tmp.empty())   

return *this;  

}  

零初始化:

對於int、double或者指標等基本型別,應該顯式地呼叫內建型別的預設建構函式,並把預設值設為0(或者false,對於bool型別而言)。比如呼叫int()我們就將獲得預設值0。

template

void foo()

對於類模板,需要定義乙個預設建構函式,通過乙個初始化列表來初始化類模板的成員。

template

class myclass ;

使用字串作為函式模板的實參:

如果把字串傳遞給函式模板的引用引數時,由於長度的區別,長度不同的字串屬於不同的陣列型別,可以通過傳遞給非引用型別的引數來解決這個問題,但對於非引用型別的引數,在實參演繹的過程中,會出現陣列到指標的型別轉換。

根據不同的情況,對此類問題的解決方法:

template

t const* max(t const (&a)[n], t const (&b)[m])

小結:

c Templates技巧性基礎知識

include pch.h include include using namespace std class upublic 在類u裡宣告乙個靜態int型別變數 static int sub 無符號整型重定義 typedef unsigned int uint4 uint4 i 類外定義靜態變數 ...

C TEMPLATES學習筆記四 技巧性基礎知識

一 關鍵字typename typename的另乙個用法 告訴編譯器把乙個特殊的名字理解為型別。如下 template class myclass templateclass myclass 沒有typename的版本可以有另一種理解 t類中的subtype成員 與 ptr 相乘。這裡用typena...

模板技巧性基礎知識

1.關鍵字typename template class myclass subtype是定義於類t內部的一種型別。因此ptr是乙個指向t subtype型別的指標。但是如果缺少typename,subtype就會被認為是乙個靜態成員,那麼它應該是乙個具體的變數或物件,於是,下面表示式 t subt...