2009-10-25 150 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 
    { 
     //... 
    } 
}