看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《james732 (好人超)》之銘言: : 遇到的問題: (題意請描述清楚) : 我想要寫出這樣的東西: : int main() : { : MyStack default; // 容器使用 vector<int> : MyStack<double> dstack; // 容器使用 vector<double> : MyStack<string, list> dlstack; // 容器使用 list<string> : } : 寫一個自定義的 stack, 裡面用 STL container 來裝資料 : 如果完全不指定 template parameter, 則預設為 vector<int> : 可以指定一個 template parameter T, 則 container 變為 vector<T> : 也可以藉由再加上第二個 parameter, 進一步的改變 container : 不過我不知道要怎麼去宣告這樣的 template class... 這可以用 template template parameter template <typename T = int, template<typename> class U = vector> class MyStack { ... }; template<typename> class U 的意思是 U 並非一般的 class name 或 native type 而是一個 template,接受一個 typename 作為參數 不過如果你按照上面的寫法,會得到 compile error 因為 vector 這個 template 並不是只有一個 type parameter 雖然我們平常用 vector<int> vector<double> 用得很習慣 但其實它有第二個 type parameter 可以讓你自訂 memory allocator 只是 STL 有一個預設的 allocator 給你用 所以我們會以為 vector 只有一個 type parameter 所以正確的宣告方法如下 template <typename T = int, template<typename,typename> class U = vector> class MyStack { ... }; MyStack<> a; // MyStack<int, vector> MyStack<double> b; // MyStack<double, vector> MyStack<double,list> c; // MyStack<double, list> 至於 MyStack<> 能不能省掉 <> 答案是不行 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.29.108
james732:太好了,我一直搞不懂 template template 的用法 03/18 15:58
VictorTom:推....orz 03/18 16:28
Killercat:james我建議你可以參考一下Modern C++ Design 03/18 16:30
Killercat:第一章講Policy class的時候會看到很多應用XD 03/18 16:30
james732:那本書我有翻過 不過消化不良 orz 03/18 17:39