Question

J'essaie de spécialiser partiellement un trait pour les tableaux de non-chars:

template<typename T>
struct is_container : std::false_type {};

template<typename T, unsigned N>
struct is_container<T[N]>
: std::enable_if<!std::is_same<T, char>::value, std::true_type>::type {};

Visual Studio 2010 me donne un C2039 (type n'est pas un élément de enable_if...). Cependant, SFINAE ne devrait-il pas juste en bas ici au lieu de donner une erreur de compilateur? Ou SFINAE ne s'applique-t-il pas dans ce cas?

Bien sûr, je pourrais simplement séparer les spécialisations pour le non-char et l'emploi:

template<typename T>
struct is_container : std::false_type {};

template<typename T, unsigned N>
struct is_container<T[N]> : std::true_type {};

template<unsigned N>
struct is_container<char[N]> : std::false_type {};

Mais j'aimerais vraiment savoir pourquoi Sfinae ne fonctionne pas dans ce cas particulier.

Était-ce utile?

La solution

Vérifiez le sujet «3.1 Activation de spécialisations de classe de modèle» àhttp://www.boost.org/doc/libs/1_47_0/libs/utility/enable_if.html

EDIT: Dans le cas où Boost.org Link meurt ...

3.1 Activation des spécialisations de classe de classe de modèle Les spécialisations du modèle de classe peuvent être activées ou désactivées avec active_if. Un paramètre de modèle supplémentaire doit être ajouté pour les expressions de facilitateur. Ce paramètre a la valeur par défaut void. Par exemple:

template <class T, class Enable = void> 
class A { ... };

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

template <class T>
class A<T, typename enable_if<is_float<T> >::type> { ... };

L'instanciation de A avec n'importe quel type intégral correspond à la première spécialisation, tandis que tout type de point flottant correspond au second. Tous les autres types correspondent au modèle principal. La condition peut être n'importe quelle expression booléenne de compilation qui dépend des arguments de modèle de la classe. Notez que encore une fois, le deuxième argument pour activer_if n'est pas nécessaire; La valeur par défaut (void) est la bonne valeur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top