Pregunta

¿Es posible especializar un método de plantillas para enumeraciones?

Algo así (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 de que no sea posible, supongamos que tengo especializaciones para varios tipos, como int, unsigned int, long long, unsigned long long, etc., entonces, ¿cuál de las especializaciones utilizará un valor de enumeración? ?

¿Fue útil?

Solución

Puede usar std::enable_if con std::is_enum de <type_traits> para lograr esto.

En una respuesta a una de mis preguntas , litb publicó una explicación muy detallada y bien escrita de cómo se puede hacer esto con los equivalentes de Boost.

Otros consejos

No estoy seguro si entiendo su pregunta correctamente, pero puede crear una instancia de la plantilla en 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);
}

Presumiblemente, lo único interesante que podría hacer con un tipo que solo saben es que es una enumeración, es convertirlo en su tipo subyacente y operar sobre eso. Así es como se vería eso, utilizando el enfoque sugerido por James (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 bonificación relacionada, aquí hay un método similar que solo se resolvería para un tipo específico de su elección (reemplace bool en is_same por 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
    {
        //...
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top