2014-06-05 1 views
1

저는 현재 템플릿을 통해 매개 변수를받는 C++ 함수를 작성하고 있습니다. 이 기능은 복잡하지만, 문제를 단순화과 같은 기능을 고려 :컴파일 타임에 알려진 매개 변수의 여러 값에 대한 함수를 컴파일하는 방법

template <int a> int foo(int b){ 
    return a+b; 
} 

을하지만 마지막 프로그램에서 위의 기능에 a이 (시간을 컴파일되지 않음) 그러나 사용자가 강제로 런타임에 알려진 것입니다 a을 1에서 5까지 제공하십시오. 즉, 정확하게 컴파일 시간에 a을 모르지만 a은 1, 2, 3, 4 또는 5 중 하나입니다.
어떻게 할 수 있습니까? 위의 함수를 각각 다른 a에 대해 5 번 컴파일하고 런타임에 적절한 것을 실행하도록 선택 했습니까?
foo_1, foo_2 등의 다른 버전을 정의하는 것이 하나의 해결책입니다. 다른 a에 대해 컴파일되지만 분명히 기능이 큰 경우 분명히 복사 된 코드의 양이 늘어납니다. 더 나은 해결책이 있습니까?

편집
내 목표는 에 다음과 같은 것을 방지하고 사용할 하나를 결정 런타임에 switch을 가지고있다. 이 같은

int foo_1(int b){ 
    return 1+b; 
} 
int foo_2(int b){ 
    return 2+b; 
} 
int foo_3(int b){ 
    return 3+b; 
} 
int foo_4(int b){ 
    return 4+b; 
} 
int foo_5(int b){ 
    return 5+b; 
} 
+0

, 당신이 그것을 가질 수 없습니다에 대한 실제 코드에서 실제 이익이다 템플릿 매개 변수로 – jrok

+0

알아. 내가 말하고자하는 것은'template'을 사용할 수 없다는 것입니다. 그러나 복사 된 코드의 양을 줄이기 위해'a'가'[1,5 ]'. – Farzad

+0

'a'를 다루는 방법은 두 가지가 있습니다. 1.'foo'를 호출하기 전에'a'의 값을 확인하십시오. 2.'foo'에서 예외를 던지면'a'가 예상 범위 내에 있지 않습니다. –

답변

4

뭔가 마음에 온다 :

내가 거기에 희망
template <int a> int foo_impl(int b){ 
    return a+b; 
} 

int (*foos[5])(int) = { 
    foo_impl<1>, 
    foo_impl<2>, 
    foo_impl<3>, 
    foo_impl<4>, 
    foo_impl<5> 
}; 

int foo(int a, int b) 
{ 
    return (foos[a-1])(b); 
} 

이 :)

가 런타임에 알려진 경우
관련 문제