2009-10-25 24 views
7

¿Es posible especializar un método de plantillas para enumeraciones?Especialización de plantillas para enumeración

Algo así como (el código no válido a continuación):

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

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

En el caso que no es posible, entonces suponiendo que tengo especializaciones para una serie de tipos, como int, unsigned int, long long, unsigned long long, etc, entonces ¿Cuál de las especializaciones usará un valor enum?

+0

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

Respuesta

6

no estoy seguro si entiendo bien su pregunta, pero se puede crear una instancia de la plantilla en las enumeraciones específicas:

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

Eso no funcionaría porque no tengo el tipo enum de antemano. – nilton

+0

en C++ 11 tiene el tipo y, por lo tanto, puede crear la plantilla enum. Un tema más agradable sería crear una plantilla basada en valores particulares de la enumeración (f ). todavía es posible con algún truco o se puede evitar simplemente declarando clases en lugar de valores enum. – GameDeveloper

1

Presumiblemente, lo único interesante que podría hacer con un tipo que lo único que lo que se debe saber es que es una enumeración, se envía a su tipo subyacente y opera sobre eso. Así es como debería parecerse, utilizando el enfoque de James sugerido (También conocido como 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)); 
} 

Como beneficio adicional relacionada, aquí hay un método similar que sólo se resuelven para un tipo específico de su elección (sustituir bool en is_same con el tipo de su elección):

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