在很多時候我們會有這麼乙個需求——
#define dup_call(func, param, ntimes)
比如我呼叫:
dup_call(puts, "hello, world!", 3);
編譯器將會自動生成——
puts("hello, world!");
puts("hello, world!");
puts("hello, world!");
那麼我們如何來實現這個需求呢?第一種方法可以使用巨集,將巨集迭代定義來展開呼叫次數。
而我這裡將使用更高階的c++的泛型機制來解決這個問題。如果我們已經有支援c++0x的編譯器,那麼可以用以下**:
1#include
<
stdio.h
>23
template
<
typename ret_type, typename param_type, ret_type func(param_type), unsigned n
>
4struct
dupstruct512
};13
14template
<
typename ret_type, typename param_type, ret_type func(param_type)
>
15struct
dupstruct
<
ret_type, param_type, func,
0>
1621
};22
23#define
dup_call(func, param, ntimes) dupstruct::dupopcall(param)
2425
intmain(
void)26
上面這段**是在vc2010 express edition上編寫的,在release模式下編譯後產生的彙編**如下:
1intmain(void)214
0040101f
xoreax,eax
1500401021
popesi
1600401022
ret
如果我們使用gcc或與其相容的編譯器,那麼我們可以使用typeof關鍵字——
#include<
stdio.h
>
template
<
typename ret_type, typename param_type, ret_type func(param_type), unsigned n
>
struct
dupstruct
};template
<
typename ret_type, typename param_type, ret_type func(param_type)
>
struct
dupstruct
<
ret_type, param_type, func,
0>
};#define
dup_call(func, param, ntimes) dupstruct::dupopcall(param)
extern"c
"void
cpp_test(
void
)
我們會發現decltype完整地保留了物件的完整的型別,由於const char[14]作為形參型別會自動弱化為const char*,因此會與模板實參型別產生衝突。而typeof修飾字串將自動獲得const char*型別,因此我們會看到typeof版本不需要對字串做強轉。
如何實現乙個迴圈佇列
下面是乙個迴圈佇列的完整實現,歡迎讀者朋友參考和指正 template class cyclicqueue cyclicqueue cyclicqueue const cyclicqueue copy m poppos 0 m count 0 cyclicqueue operator const c...
如何實現乙個迴圈佇列
template class cyclicqueue cyclicqueue cyclicqueue const cyclicqueue copy m poppos 0 m count 0 cyclicqueue operator const cyclicqueue other return thi...
如何實現乙個迴圈佇列
template class cyclicqueue cyclicqueue cyclicqueue const cyclicqueue copy m poppos 0 m count 0 cyclicqueue operator const cyclicqueue other return thi...