2014-01-06 117 views
3

更換的#define我有這樣的代碼:減少重複代碼,並與模板

#define defaultOnTimer(N, X) \ 
if (Timers.N) Timers.N --; \ 
if (!Timers.N) S.X = D.X; \ 

defaultOnTimer(t1, sig1); 
defaultOnTimer(t2, sig2); 
defaultOnTimer(t3, sig3); 
defaultOnTimer(t4, sig4); 

雖然這個作品,我想知道是否有可能使用C++模板同樣的工作。 'defaultOnTimer'可能會在將來擴展到額外的工作,所以我不想只根據需要複製它多次,然後必須找到並修改每一個。

或者這只是一個過於複雜的工作,我應該堅持使用#define?

請注意,S.X可以是任何類型。

+1

沒有模板不能這樣做。如果你願意稍微改變界面,他們可以做類似的事情(而S與D的類型相同)。 –

回答

0

它看起來可怕,但它的工作原理莫名其妙:

template<typename A, size_t N, typename B, size_t X> 
void onTimer() 
{ 
    A& n = *(A*)(&Timers + N); 
    if (n) 
    { 
     --n; 
    } 
    if (!n) 
    { 
     *(B*)(&S + X) = *(B*)(&D + X); 
    } 
} 

這裏有一個例子:

struct Timer 
{ 
    int t1, t2, t3, t4; 
}; 
struct Sig 
{ 
    char sig1, sig2, sig3, sig4; 
}; 

Sig S, D; 
Timer Timers; 

void a() 
{  
    onTimer<int, offsetof(Timer, t1), char, offsetof(Sig, sig1)>(); 
} 

DSTimers應該是全局變量。你可以將它們作爲函數參數避免這種情況:

template<typename A, size_t N, typename B, size_t X> 
void onTimer(Timer* timer, Sig* sigS, Sig* sigD) 
{ 
    A& n = *(A*)(timer + N); 
    if (n) 
    { 
     --n; 
    } 
    if (!n) 
    { 
     *(B*)(sigS + X) = *(B*)(sigD + X); 
    } 
} 

void a() 
{  
    Sig S, D; 
    Timer Timers; 
    onTimer<int, offsetof(Timer, t1), char, offsetof(Sig, sig1)>(&Timers, &S, &D); 
} 

我想這回答你的問題,但它仍然是一個胡思亂想的解決方案