2009-05-31 1 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(); 
}