2012-12-03 4 views
0

을 수행나는 다음과 같은 코드를 단순화하고자하는 "루프"

index은 컴파일 시간 상수이다
switch (index) 
    { 
    case 1: 
     output = function1(); 
     break; 
    case 2: 
     output = function2(); 
     break; 
    case 3: 
     output = function3(); 
     break; 
    .... 

.

프리 컴파일러 매크로를 사용하려면 n 번을 사용해야합니다. 여기에서 n은 숫자입니다. 위에서 언급 한 코드를 O (1) 코드 줄까지 어떻게 줄일 수 있습니까?

+0

왜이 작업을 수행하고 코드가 덜 읽을 수 있도록? –

+0

@EdHeal 코드를 더 읽기 쉽게 만들어주는 사전 컴파일러 마법이 있기를 바랬습니다. 뭔가 같은 출력 = SOME_MAGICAL_MACRO (함수, 인덱스) –

+0

아래 내 대답보기 –

답변

1

수퍼 매크로는 작업을 약간 단순화 할 수 있습니다. 단순히 코드 "counter.def"파일 작성 : 시도이 (가정 함수 1-N 또는 스위치 반복 계산

switch(index) 
{ 
    #define COUNTER(i) case i: output = function##i(); break; 
    #include "counter.def" 
} 
+2

오, 안돼요 ... 절대 C++에서는 그렇게하지 마십시오. – Cartesius00

3

과 다른 구성을 사용하는 모든 경우에 그런

COUNTER(1) 
COUNTER(2) 
COUNTER(3) 
#undef COUNTER 

을 아르 실제 이름과 당신이 말한대로 그 지수는이다, 컴파일 시간 상수) :.

#define CALLFUNCTION(x) function##x() 

output = CALLFUNCTION(1); 

보정 :이 V 작동하지 않습니다 ariables는 상수가 직접 사용될 경우 작동합니다. 제공된 코드가 각각의 경우에 모두 존재하면 목적을 무력화시킬 수 있습니다.

스위치를 전혀 할 필요가 없습니다. 또는 템플릿 전문화를 사용할 수도 있습니다.

template<int index> function(); 

output = function<index>();  

각 색인의 기능 템플릿을 특수화하십시오. 이 컴파일 시간이 일정하지 않으면

template<> function<1>(){return 1;} // or {return function1();} 

, 당신은 Fomin Arseniy이 시사하는 것처럼 스위치를 생성해야합니다. 또 다른 옵션은

+0

감사합니다! 한 가지 문제는 function1, ..., functionn의 정의를 변경할 수 없다는 것입니다. –

+0

문제가되지 않습니다. 첫 번째 방법은 그대로 작동합니다. 두 번째 방법은 function1-functionn에 대한 래퍼가 될 수 있습니다. –

+0

컴파일러 오류가 발생합니다. 'functionindex'에는 템플릿 매개 변수에 의존하는 인수가 없으므로 ' functionindex '를 사용할 수 있어야합니다. [-fpermissive] –

3

매크로와 함께 할 수없는 함수 포인터의 배열을 사용하는 것입니다 -하지만이 작동합니다 (내 생각) :

int (*functions[])() = { &function1, &function2, &function3}; 

int output = functions[index](); 
+0

고마워요! 이 작품! –

관련 문제