supposément des membres d'une classe de modèle ne doivent pas être instanciés à moins d'être utilisés.
Cependant, cet échantillon semble instancier le membre am Je manque quelque chose vraiment basique ici? P> Coliru < / p> p> DO_Something code> membre et le
activer_if code> échoue (ce qui serait attendu si nous l'avions instancié - mais afaik nous n'avons pas).
3 Réponses :
Sfinae ne se produit que sur la fonction de modèle / la méthode (ici, c'est votre classe qui est modèle),
vous pouvez faire en C ++ 11 (paramètre de modèle par défaut pour la fonction / la méthode): P>
template <bool> struct helper_do_something {}; template <> struct helper_do_something<true> { void do_something() { /* Your implementation */ } }; template <typename policy> class test : helper_do_something<T::condition::value> { // do_something is inherited (and it is present only when T::condition::value is true) };
Non, la version boost de activer_if code> Il faut un type, contrairement à la version C ++ 11.
activer_if_c code> prend un type.
(Désolé, cela devrait dire " activer_if_c code> prend une valeur b>". Trop tard pour le corriger.)
@ Melak47: J'ai ajouté une autre solution qui fonctionne avec C ++ 98 (et sans Sfinae).
de C ++ 11 14.7.1 / 1: P>
L'instanciation implicite d'une spécialisation de modèle de classe provoque l'implicite Instanciation des déclarations, mais non des définitions ou des arguments par défaut, des fonctions de membre de la classe p> blockQuote>
La déclaration de fonction est donc instanciée; qui échoue depuis que cela dépend d'un type invalide. P>
(Malheureusement, je n'ai aucune version historique de la norme à la main, mais j'imagine que cette règle était similaire à C ++ 98) sub> p>
@Niall: Parce que activer_if code> n'a aucun membre appelé
type code> lorsque la condition est fausse.
OK, je comprends, le Boost Enable_if s'attend à ce que le type ait une valeur intégrée qu'elle teste pour, contrairement à STD Enable_if, qui attend seulement la condition booléenne.
Mike Seymour a déjà répondu pourquoi cela ne fonctionne pas, voici comment contourner la situation: règle rapide: Si vous voulez faire Sfinae, vous avez besoin d'une fonction membre Modèle em>. p> p>