2009-10-25 3 views
7

enums에 대한 templatized 메소드를 특화 할 수 있습니까?enum 템플릿 전문화

(아래 잘못된 코드)와 같은 뭔가 : 그것은 불가능 경우

template <typename T> 
void f(T value); 

template <> 
void f<enum T>(T value); 

, 나는이 유형의 숫자에 대한 전문이 랬를 등, 다음 int, unsigned int, long long, unsigned long long 같은 enum 값으로 사용할 특수화는 무엇입니까?

+0

는 http://stackoverflow.com/questions/29762892/how-to-specialize-a-template-function-for-enum-and-specific-type –

답변

19

std::enable_if<type_traits>과 함께 사용하면이 작업을 수행 할 수 있습니다.

In an answer to one of my questions litb는 매우이고 Boost 등가물로 어떻게 수행 할 수 있는지에 대한 자세한 설명을 게시했습니다.

+0

이 보인다 작동하는 것처럼. 나는 그것을 살펴보고있다. 감사! – nilton

6

는 내가 제대로 질문을 이해한다면 모르겠지만, 특정 열거에 템플릿 인스턴스화 할 수 있습니다 : 아마도

template <typename T> 
void f(T value); 

enum cars { ford, volvo, saab, subaru, toyota }; 
enum colors { red, black, green, blue }; 

template <> 
void f<cars>(cars) { } 

template <> 
void f<colors>(colors) { } 

int main() { 
    f(ford); 
    f(red); 
} 
+2

미리 열거 형을 가지고 있지 않기 때문에 효과가 없을 것입니다. – nilton

+0

C++ 11에서는 형식이 있으므로 열거 형 템플릿을 만들 수 있습니다. 더 좋은 주제는 enum (f )의 특정 값을 기반으로 템플릿을 만드는 것입니다. 일부 트릭커로 가능하거나 단순히 enum 값 대신 클래스를 선언함으로써 피할 수 있습니다. – GameDeveloper

1

, 당신은 종류가 유일한 것은 당신이 함께 할 수있는 유일한 재미있는 일을 그것이 열거 형 (enum)이라는 사실을 알기 때문에 기본 유형으로 캐스팅하고이를 조작합니다. 여기에 제임스 '제안 방식 (일명 SFINAE)를 사용하여,처럼 보일 수 있습니다 방법 : 관련 보너스로

void Bar(int b); // and/or other underlying types 

template<typename T> 
typename std::enable_if<std::is_enum<T>::value, void>::type 
Foo(T enm) 
{ 
    Bar(static_cast<typename std::underlying_type<T>::type>(enm)); 
} 

, 여기에만 사용자가 선택한 특정 유형에 대한 해결받을 것 유사한 방법이야을 (is_same에 부울 교체 사용자가 선택한 유형)에 :

template<typename T> 
typename std::enable_if<std::is_same<T,bool>::value, void>::type 
Baz(T bl) 
{ 
    if (bl) 
    { 
     //... 
    } 
    else 
    { 
     //... 
    } 
} 
관련 문제