9
votes

Les membres d'un modèle de classe sont-ils instanciés lorsque la classe est instanciée?

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 DO_Something membre et le activer_if échoue (ce qui serait attendu si nous l'avions instancié - mais afaik nous n'avons pas).

am Je manque quelque chose vraiment basique ici? xxx

Coliru < / p>


0 commentaires

3 Réponses :


4
votes

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


3 commentaires

Non, la version boost de activer_if Il faut un type, contrairement à la version C ++ 11. activer_if_c prend un type.


(Désolé, cela devrait dire " activer_if_c prend une valeur ". Trop tard pour le corriger.)


@ Melak47: J'ai ajouté une autre solution qui fonctionne avec C ++ 98 (et sans Sfinae).



8
votes

de C ++ 11 14.7.1 / 1:

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

La déclaration de fonction est donc instanciée; qui échoue depuis que cela dépend d'un type invalide.

(Malheureusement, je n'ai aucune version historique de la norme à la main, mais j'imagine que cette règle était similaire à C ++ 98)


2 commentaires

@Niall: Parce que activer_if n'a aucun membre appelé type 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.



6
votes

Mike Seymour a déjà répondu pourquoi cela ne fonctionne pas, voici comment contourner la situation: xxx

règle rapide: Si vous voulez faire Sfinae, vous avez besoin d'une fonction membre Modèle .


0 commentaires