2009-05-31 8 views
1

関数内でマクロを複数回使用する必要があり、使用する必要があるマクロは関数に渡す数値によって異なります。整数によるマクロ使用

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

問題は次のとおりです。同じマクロでswitch文ごとに行うべきことがたくさんあります。 スイッチのステートメントにそのようなものがすべて含まれているより洗練されたソリューションがありますか?マクロ自体を関数に渡すのと同じですか?私はC++のメソッドのようにeval()について読んだことがありますが、彼らは私にはうってつけです。もう一つの方法は、マクロが展開するものを決定することですが、私はこれに関する情報は見つかりませんでした。

ああ、実際にはOpenGLです。

答えて

8

私はこの非常に多くのように展開するものMACRO1に依存

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

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

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

なぜ関数ポインタを使用しないのですか? –

+0

op()を使用する関数オブジェクトはより高速でインライン化できるためです。彼がOpenGLをやっていることを考えると、スピードが重要だと思います。 –

4

関数オブジェクトを使用します。定数の場合は、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(); 
} 
関連する問題