2009-10-25 16 views
7

È possibile specializzare un metodo templato per enumerare?Specializzazione modelli per enum

Qualcosa di simile (il codice non valido sotto):

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

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

Nel caso non è possibile, quindi se io ho specializzazioni per un certo numero di tipi, come int, unsigned int, long long, unsigned long long, ecc, allora quale delle specializzazioni userà un valore enum?

+0

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

risposta

19

È possibile utilizzare std::enable_if con std::is_enum da <type_traits> per ottenere ciò.

In an answer to one of my questions, litb postato a molto spiegazione dettagliata e ben scritta di come questo può essere fatto con gli equivalenti Boost.

+0

questo sembra come potrebbe funzionare. Lo sto dando un'occhiata. Grazie! – nilton

6

non sono sicuro se ho capito bene la tua domanda, ma è possibile creare un'istanza del modello su enumerazioni specifiche:

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

Questo non funzionerebbe perché non ho il tipo enum in anticipo. – nilton

+0

in C++ 11 hai il tipo e quindi puoi creare il modello enum. Un argomento migliore sarebbe quello di creare un modello basato su valori particolari dell'enumerazione (f ). ancora possibile con qualche trucco o può essere evitato semplicemente dichiarando le classi al posto dei valori enum. – GameDeveloper

1

Presumibilmente, l'unica cosa interessante che si potrebbe fare con un tipo che unica cosa che si sapere che è un enum, che è lanciato al suo tipo sottostante e operare su quello. Ecco come che potrebbe essere simile, utilizzando l'approccio di James' suggerito (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)); 
} 

Come bonus correlato, ecco un metodo simile che avrebbe avere risolto solo per un tipo specifico di vostra scelta (sostituire bool in is_same al tipo di vostra scelta):

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