Domanda

È possibile specializzare un metodo templatizzato per gli enum?

Qualcosa di simile (il codice non valido di seguito):

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

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

Nel caso non sia possibile, supponiamo quindi che io abbia specializzazioni per un certo numero di tipi, come int, unsigned int, long long, unsigned long long, ecc., quindi quale delle specializzazioni utilizzerà un valore enum ?

È stato utile?

Soluzione

Puoi utilizzare std::enable_if con std::is_enum da <type_traits> per ottenere questo risultato

In una risposta ad una delle mie domande , litb ha pubblicato una molto spiegazione dettagliata e ben scritta di come ciò può essere fatto con gli equivalenti Boost.

Altri suggerimenti

Non sono sicuro di aver compreso correttamente la tua domanda, ma puoi creare un'istanza del modello su enum specifici:

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);
}

Presumibilmente, l'unica cosa interessante che potresti fare con un tipo che l'unica cosa che conosci è che è un enum, è lanciarlo nel suo tipo sottostante e operare su quello. Ecco come potrebbe apparire, usando l'approccio suggerito da James (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 verrebbe risolto solo per un tipo specifico di tua scelta (sostituisci bool in is_same al tipo di tua scelta):

template<typename T>
typename std::enable_if<std::is_same<T,bool>::value, void>::type
Baz(T bl)
{
    if (bl)
    {
        //...
    }
    else
    {
        //...
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top