C template 學習筆記 (第五章)

2022-02-08 09:56:02 字數 2778 閱讀 4883

技巧性基礎知識

1. 關鍵字 typename

2.使用this->

3.成員模板

4.模板的模板引數

5.零初始化

6.字串作為函式模板的實參

1. 關鍵字typename

在c++中,引入typename是為了說明:模板內部的識別符號可以是乙個型別。譬如下面:

1 template 2

class

myclass ;

上面第三行的typename就是用來說明subtype是個型別,ptr是個指向subtype型別的指標,而不是表示subtype與ptr的乘積。

對於如下示例:

1 template 

2void printbitset (std::bitsetconst&bs)

在此處,如果不使用.template這個構造,編譯器將不知道bs.template後面的小於號是模板引數列表的起始符號,引起這個的主要原因是傳入引數bs本身依

賴於引數n的構造。

因此,只有當該前面存在依賴於模板引數的物件時,我們需要在模板內部使用.template標記,而此標記也只能在模板內部使用。

2. this->的使用

對於如下示例:

1 #include 2

3 template 4

class

base 9};

1011 template 12

class derived : base

18};

1920

21int

main ()

很明顯,會輸出:

derived::foo()!

base::exit() !

如果將16行的this->去掉則會輸出:

derived::foo()!

在這個例子中,foo()內部決定呼叫那乙個exit()時,並不會考慮基類base中定義的exit()。因此,如果不加上this->,不是呼叫了乙個錯誤的exit()函式,

就是獲得了乙個編譯錯誤。

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

3. 成員模板

類的成員也可以是模板,巢狀類和成員函式都可以作為模板。如下示例:

1 template 2

class

stack

1314

//使用元素型別為t2的棧進行賦值

15 template //

成員模板

16 stack& operator= (stackconst&);

17};

1819 template 20 template 21 stack& stack::operator= (stackconst&op2)

2526 stacktmp(op2);

2728

elems.clear();

29while (!tmp.empty())

33return *this

;34 };

在上段示例中第15 16行在定義有模板引數t的模板內部,定義了乙個含有模板引數t2的內部模板:

template

template

4. 模板的模板引數

根據名字,我們很容易想到,此處就是說,將乙個模板作為乙個模板引數來使用。示例如下:

template template 

class cont = std::deque >

class

stack ;

在這個例子中,我們使用了第乙個模板引數作為第二個模板引數的例項化型別。一般來說,我們可以使用型別模板內部的任何型別來例項化模板的模板引數。

當第二個模板引數,即模板的模板引數有預設值的時候,會有可能,因為在宣告的時候未指定這個預設值而產生 預設值與模板的模板引數不匹配的錯誤資訊。 因此對於將具有預設值的模板作為模板引數時,可以在使用時指定預設值。

5. 零初始化

在編寫模板時,如果希望模板型別的變數使用預設值初始化,我們需要顯示的呼叫內建型別的預設建構函式,如int()可以獲得預設值 0 。**如下:

1 template 2

void

foo ()

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

如下**:

1 template 2 inline t const& max (t const& a, t const&b)56

intmain ()

上述的問題在於這些字串屬於不同型別的陣列型別。他們的型別分別是:

"peach"          char const[6]

"tomato"        char const[7]

s                   std::string

因此上述呼叫時會出現不同的型別實參從而產生錯誤。

解決的方法是:

1). 對於字串的呼叫,使用非引用引數

2). 進行過載,編寫接受引用引數和非引用引數兩個過載函式 (注意二義性)

3). 對具體型別進行過載 (比如對 std::string 進行過載)。

4). 過載陣列型別,比如:

1 template int n, int m>

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

5). 強制要求應用程式設計師使用顯示型別轉換

C Template 讀書筆記 第五章

內容 技巧性基礎知識 關鍵字 typename template this 模板的模板引數 零初始化 字串的模板實參 具體內容描述 1.對模板使用typename 場景 template class test 這裡需要增加typename,需要標記告訴編譯器這個是宣告乙個模板引數型別t裡面的subt...

C template第五章總結

1.如果要訪問依賴於模板內部的型別,前面要加上typename,如 tempateclass my subtype是定義於t內部的型別 2.在多繼承中,要使用this指明要訪問的本成員函式 3.可以過載 讓不同的模板之間可以賦值,但是不會忽略型別檢查 如 stackint1 stackf2 f2 i...

第五周學習筆記

課程位址 第十三講,高斯混合模型 主要內容 值得注意的地方 1.em演算法的收斂 em演算法通過最大化似然函式的下界 使用jesen不等式得到 來近似最大化似然函式,其優化過程相當與對於其下界函式的座標上公升。2.高斯混合模型的優化 q step中的優化是乙個條件極值問題,約束是 j j 1 sig...