2017-07-20 3 views
1

Je souhaite utiliser enable_if pour définir une classe pour certains types. Parmi ces types, j'ai besoin d'utiliser des types de modèles, et je suis incapable de le faire fonctionner. Voici un MWE:Utilisez enable_if avec deux niveaux de modèle

La classe basé sur un modèle A:

template<typename T, typename Enable = void> class A; 

Sa spécialisation pour certains types simples, tels que les types intégrés ici, peuvent être définis comme suit:

template<typename T> 
class A<T, std::enable_if<std::is_integral<T>::value>::type> 
{ ... }; 

Maintenant, je définis un tas de types de modèles:

template<typename U> class X {...}; 
template<typename U> class Y {...}; 

Comment dois-je procéder pour spécialiser ma classe A pour les types X et Y?

Deux tentatives qui ne fonctionnent pas:

  1. avec ce qui suit, en déclarant un objet de type A<X<int> > par exemple donne une erreur incomplete type:

    template<typename U> 
    template<typename T> 
    class A<T, std::enable<std::is_same<T, X<U> >::value 
            || std::is_same<T, Y<U> >::value>::type> 
    { ... }; 
    
  2. avec ce qui suit, l'erreur est 'T' is not a template.

    template<typename U> 
    template<typename T> 
    class A<T<U>, std::enable<std::is_same<T, X>::value 
             || std::is_same<T, Y>::value>::type> 
    { ... }; 
    

Répondre

5

X et Y sont modèles de classe, pas les types. Votre compilateur se plaint correctement d'utiliser un type en tant que modèle de classe dans votre second exemple.

Si vous voulez une spécialisation pour les

template<typename> 
class A; 

template<typename T> 
class A<X<T>> : A_for_XY<X<T>> {}; 

template<typename T> 
class A<Y<T>> : A_for_XY<Y<T>> {};