C 雙重模板

2021-07-09 11:55:50 字數 2003 閱讀 1818

模板引數本身也可以是乙個類模板,例如實現乙個stack class。

為了使用其他型別的元素容器,使用者必須兩次指定元素型別:一次是元素型別本身,另一次是容器型別:

stack vstack;  //int stack,以vector為容器
如果使用template template parameter,就可以只指明元素型別,無需在指定容器型別:

stack vstack;
為了實現這種特性,你必須把第二個template parameter 宣告為template template parameter.

templateclass cont = std::deque>

class

stack;

其預設值則由std::deque 變更為std::deque。這個引數必須是class template,並以第一引數型別完成例項化:

cont elems;
實際運用時可以使用class template內的任何型別來例項化乙個template template parameter。

通常情況下,可以將class關鍵字改為typename來宣告乙個template parameter;但是 cont定義的是乙個class型別,因此必須使用關鍵字class來宣告它。

所以,以下為正確**:

templateclass cont = std::deque>      //ok

class stack{};

而下面的**則是錯誤的:

templateclass cont = std::deque>      //ok

class stack{};

所有成員函式也必須按此規則修改:必須指定其第二個template paarmeter為template template parameter。同樣的規則也適用成員函式的實現部分。

注意:模板函式不允許擁有template template parameters。

以下是完整**:

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

template

class cont = std::deque >

class stack

template

class cont2>

stack& operator=(stackconst&);

};template

class cont>

void stack::push(t const& elem)

template

class cont>

void stack::pop()

elems.pop_back();

}template

class cont>

t stack::top()const

return elems.back();

}template

class cont>

template

class cont2>

stack&

stack::operator=(stackconst& op2)

stacktmp(op2);

elems.clear();

while (!tmp.empty())

return *this;

}int main()

catch (std::exception const& ex)

stack vstack;

vstack.push(42);

cout

<< vstack.top()0;}

C語言雙重置換加密

金鑰 置換規則 1,2,3,4,5,6,7,8 2,3,4,5,6,7,8,1 進行行置換,1,2,3,4,5,6,7,8 3,4,5,6,7,8,1,2 進行列置換。include include int main printf 原文是 s s s n yw 0 yw 1 yw 2 char zh...

雙重for迴圈

雙重for迴圈就是在乙個for迴圈裡在巢狀另乙個for迴圈,ji 即兩個迴圈巢狀,還有多重迴圈巢狀的情況,但用的比較少,一般常用的是兩個迴圈巢狀,很少使用多重迴圈,因為for迴圈多了會導致 執行的效率低,而且容易宕機,多迴圈中的總迴圈次數是相乘的,巢狀幾次後幾何級數增長,因此通常情況下在迴圈多次巢狀...

雙重for迴圈

雙重for迴圈 1 概述 很多情況下,單層for迴圈並不能滿足我們的需求,比如我們要列印乙個5行5列的圖形,列印乙個倒直角三角形等,此時就可以通過迴圈巢狀來實現 迴圈巢狀是指在乙個迴圈語句中再定義乙個迴圈語句的語法結構,例如在for迴圈語句中,可以再巢狀乙個for迴圈,這樣的for迴圈語句我們稱之為...