9
votes

Spécialisation des modèles pour Enum

est-il possible de spécialiser une méthode modélisée pour Enums?

quelque chose comme (le code invalide ci-dessous): xxx

dans le cas que ce n'est pas possible, alors supposant J'ai des spécialisations pour un certain nombre de types, comme int , non signé int , long long , non signé long long , etc, alors laquelle des spécialisations une valeur d'énorme utilisera?


4 Réponses :


22
votes

Vous pouvez utiliser std :: activer_if avec std :: is_eum à partir de < Type_Traits> pour accomplir cela.

dans une réponse à l'une de mes questions , LitB a publié une explication très détaillée et bien écrite de la manière dont cela peut être fait avec les équivalents de boost.


1 commentaires

Cela semble que cela pourrait fonctionner. Je regarde un coup d'oeil. Merci!



7
votes

Je ne sais pas si je comprends votre question correctement, mais vous pouvez instancier le modèle sur spécifique Enums:

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 commentaires

Cela ne fonctionnerait pas parce que je n'ai pas le type d'enum à l'avance.


En C ++ 11, vous avez le type et vous pouvez donc créer le modèle ENUM. Un sujet plus agréable serait de créer un modèle en fonction d'une valeur particulière de l'énum (F ). toujours possible avec une certaine plus tendre ou peut être évitée en déclarant des classes au lieu de valeurs ENUM.



2
votes

Vraisemblablement, la seule chose intéressante que vous puissiez faire avec un type que vous savez que vous savez que c'est un énumé, le jette à son type sous-jacent et qu'il convient à ce sujet. Voici comment cela pourrait ressembler à une approche suggérée de James '(AKA Sfinae ) :

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


0 commentaires

0
votes

Vous pouvez également utiliser std :: activer_if code> dans l'un des arguments de modèle. S'il ne peut pas compiler, la fonction n'est pas instanciée du tout (sfinae).

template <typename T>
void f(T value) 
{ /* implementation A */ }

template <typename T,
          typename = std::enable_if<std::is_enum<T>::value, bool>::type >
void f(T value) 
{ /* implementation B */ }


0 commentaires