看板 C_and_CPP 關於我們 聯絡資訊
用 void* 來實作泛型…… class stack { void** _data ; void push(void* v) ; void* pop() ; } ; int main () { // int stack iStack ; iStack.push ( (void*) new int ) ; // push int* n = (int*) iStack.pop() ; // pop // double stack dStack ; dStack.push ( (void*) new double ) ; // push double* n = (double*) dStack.pop() ; // pop } ; 用起來很麻煩的,而且效能低落,也不安全。(敝公司用的就是這種 orz) 另外一個作法是用 macro 把整個 class 宣告包起來…… #define STACK(T) class stack_##T { \ T *_data ; \ void push( T v ) ; \ T pop() ; \ } STACK(int) ; // 等於宣告整個 stack_int STACK(double) ; // 宣告整個 stack_double int main () { stack_int iStack ; stack_double dStack ; } 你比較喜歡哪一種 @@? -- To iterate is human, to recurse is divine. 遞迴只應天上有, 凡人該當用迴圈.   L. Peter Deutsch -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.160.105.151
elfkiller:看起來第二種比較好 那第二種有沒有什麼缺點呢? 03/08 23:20
akasan:相較template起來第二種每多用一種型別就要先STACK(XXX) 03/08 23:24
yoco315:第二種喔.. 能塞的型別有限囉.. 比方說你寫 STACK(int*) 03/08 23:31
yoco315:就爆炸啦…因為展開會是 class stack_int* { } ; 03/08 23:32
elfkiller:原來如此 感謝感謝 03/08 23:35
littleshan:可以用 typedef 來解決 int* 的問題 03/08 23:36
yoco315:但是這個可以克服啦.. 型別跟修飾名分開給就好 03/08 23:36
yoco315:#define(T,N) class stack_##N { T* _data ; } 03/08 23:37
yoco315:STACK(int*, intp) ; int main(){ stack_intp ipStack; } 03/08 23:37
yoco315:哇~小善出手了~ XD 03/08 23:38
yoco315:跟1比起來我比較喜歡2, 可以選template的話當然是首選 03/08 23:39
elfkiller:喔喔 有道理 typedef也是類似用法嗎? 03/08 23:40
yoco315:typedef int* intp; STACK(intp) ; 03/08 23:43
littleshan:驚!你該不會認識我同學? 03/08 23:44
yoco315:當然不認識,你的id不就是小善嗎 XD 03/08 23:45
littleshan:也可以是山或閃啊 03/08 23:47
yoco315:單純猜中,這就是大宇宙的意志 03/08 23:49
Peruheru:小善我也認識,不過我認識的是法律系的 03/09 10:40
adrianshum:其實第二種概念上也比較接近 template 03/09 10:55