2009-10-25 116 views
7

是否可以专门为枚举模板化方法?枚举模板专精

喜欢的东西(以下无效代码):

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

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

在这是不可能的话,那么假设我有专业化的多种类型,如intunsigned intlong longunsigned long long,等等,然后枚举值将使用哪些专门化?

+0

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

回答

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中,您有类型,因此您可以创建枚举模板。一个更好的主题是根据枚举的特定值创建模板(f )。仍然可能有一些tricker或可以通过只声明类而不是枚举值来避免。 – GameDeveloper

1

想必,你可以用一个类型,他们唯一的事情你做的唯一有趣的事情知道它是一个枚举,将它投射到它的基本类型并对其进行操作。以下是如何可能的样子,用詹姆斯的建议的方法(AKA 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 
    { 
     //... 
    } 
}