如何實現重複呼叫乙個函式,非迴圈

2022-04-03 07:41:48 字數 1906 閱讀 5212

在很多時候我們會有這麼乙個需求——

#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模式下編譯後產生的彙編**如下:

1

intmain(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...