2015-01-13 4 views
0

나는 템플릿 함수와 열거 형에 대한 템플릿 사양을 가지고 있습니다. 런타임시 열거 형 값을 기반으로 템플릿 사양을 선택하는 프로그램을 원합니다. 가능한가?템플릿 변수가 아닌 형식 인수로 로컬 변수

다음 코드는 오류가 발생했습니다 :

error C2971: 'Func' : template parameter 'fruit' : 'fruit' : a local variable cannot be used as a non-type argument 

코드 :

enum class Fruit 
{ 
    Apple, 
    Orange, 
    Count 
}; 

template<Fruit> 
void Func() 
{} 

template<> 
void Func<Fruit::Apple>() 
{ 
    std::cout << "Apple" << std::endl; 
} 

template<> 
void Func<Fruit::Orange>() 
{ 
    std::cout << "Orangle" << std::endl; 
} 

void Foo(Fruit fruit) 
{ 
    Func<fruit>(); // error C2971: 'Func' : template parameter 'fruit' : 'fruit' : a local variable cannot be used as a non-type argument 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    Foo(Fruit::Apple); 
    return 0; 
} 

답변

2

I want the program to choose the template specification based on the value of enum at runtime.

아니, 그건 불가능합니다. 템플릿 비 형식 인수는 컴파일 타임에 사용할 수 있어야합니다. 런타임까지 값이 없으면 함수 인수로만 전달할 수 있습니다.

당신 수행 TC는 가능한 모든 값에 switch이며, 명시 적으로 컴파일 시간 상수 리터럴 것과 Func 호출에서 알 수 있듯이 다음에 잘

void Foo(Fruit fruit) 
{ 
    switch (fruit) { 
    case Fruit::Apple: 
     Func<Fruit::Apple>(); 
     break; 
    case Fruit::Orange: 
     Func<Fruit::Orange>(); 
     break; 
    // .. maybe other fruits here 
    } 
} 
+0

를, 그것은 가능 ('switch' 런타임 인수를 찾고 적절한 인스턴스를 호출하십시오. –