2012-10-04 58 views
4

說我有一些類模板:如何部分專門化所有枚舉的類模板?

template<typename T> 
class { 
// .... 
} 

我可以部分專門這個模板ALL指針方式:

template<typename T> 
class<T *> { 
// .... 
} 

我可以採用某種專門爲ALL枚舉模板?即,這樣做: (這是不行的,雖然)

template<typename T> 
class<enum T> { 
// .... 
} 
+0

不,你不能.. –

回答

15

使用C++ 11和SFINAE。

#include <type_traits> 

template<typename T, typename = void> 
struct Specialize 
{ 
}; 

template<typename T> 
struct Specialize<T, typename std::enable_if<std::is_enum<T>::value>::type> 
{ 
    void convert() { } 
}; 

enum E 
{ 
}; 

int main() 
{ 
    Specialize<E> spec; 
    spec.convert(); 
} 

沒有C++ 11使用boost::enable_ifboost::is_enum

+0

THX,該訣竅。 – qwer1304

+0

@ qwer1304功能模板專業化不是好主意。你不能部分專門化功能模板,只能顯式專門化。 – ForEveR

+1

此方案適用於類,但我無法在功能模板中使用它,例如: template U f(int i); 模板 ::值,U> ::類型>ûF(int i)以 { ...; } enum myenum {A,B,C,D}; (){ myenum xx; xx = f (1); // [1] xx = f (2); // [2] } 使用gcc 4.7.2並使用-std = C++ 11,[1]導致對未定義的'myenum f (int)'和[2] myenum f myenum,myenum>(int)'。 想法? – qwer1304