2009-05-31 16 views
1

我必須在函數內多次使用一個宏,並且需要使用的宏取決於我傳遞給函數的數字。宏的使用取決於整數

例如

function(int number) { 
    switch(number) { 
     case 0: doStuff(MACRO0); break; 
     case 1: doStuff(MACRO1); break; 
    } 
    } 

問題是:我有很多東西要做每個switch語句與相同的宏。 是否有更優雅的解決方案,然後在switch語句中包含所有這些東西?就像將宏本身傳遞給函數一樣?我已經閱讀了有關eval()方法的C++,但他們只是不適合我。另一種方法可以確定宏的擴展,但我還沒有找到任何信息。

哦,它實際上是openGL。

回答

8

我會用一個函數對象

struct Method1 { 
    void operator()() { ... } 
}; 

template<typename Method> 
void function(Method m) { 
    ... 
    m(); 
    ... 
} 

int main() { 
    function(Method1()); 
} 
+0

爲什麼不使用函數指針? – 2009-06-01 07:36:27

4

這在很大程度上取決於什麼MACRO1擴展到。如果這是一個常數,你可以在switch之外調用該函數,或者做多個突破案例。如果它取決於當地的情況,那麼你將不得不每次評估它。

2

除了上面的建議,我經常發現使用虛擬繼承可以擺脫長條件,特別是交換枚舉類型代碼。我不知道你的具體情況,所以我不知道他將如何適用的是,但是我們要說的是以上

enum StyleID { STYLE0 = 0, STYLE1, STYLE2 /* ... */ }; 

void drawStyle(StyleID id) { 
    switch(id) { 
    case STYLE1: doDraw(MACROSTYLE1); break; 
    /* ... */ 
    }; 
} 
可以通過虛擬繼承避免

開關的長塊:

class StyleInterface { 
    /* some methods */ 
    virtual void doDraw() = 0; 
}; 

class Style1 : public StyleInterface { 
    /* concrete impl */ 
    virtual void doDraw() { doDraw(MACROSTYLE1); } 
}; 

void drawStyle(StyleInterface* id) { 
    id->doDraw(); 
}