推 LPH66:template<class T=int, class Container=vector<T> > 03/18 14:59
→ LPH66:不過這樣一來全部用預設要寫成 MyStack<> 03/18 14:59
→ LPH66:你的第三個也要寫成 MyStack<string, list<string> > 03/18 15:00
→ james732:一樓的寫法我試過 問題就如你二三樓的補充 我希望避免 03/18 15:01
→ james732:因此才想問問看有沒有更好的寫法 XD 03/18 15:01
> -------------------------------------------------------------------------- <
作者: littleshan (我要加入劍道社!) 看板: C_and_CPP
標題: Re: [問題] template stack
時間: Thu Mar 18 15:56:38 2010
※ 引述《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