Sélection d'une fonction membre en utilisant différentes conditions enable_if
Je suis en train de déterminer la version d'un membre de la fonction est appelée fonction du modèle de classe paramètre. J'ai essayé ceci:
#include <iostream>
#include <type_traits>
template<typename T>
struct Point
{
void MyFunction(typename std::enable_if<std::is_same<T, int>::value, T >::type* = 0)
{
std::cout << "T is int." << std::endl;
}
void MyFunction(typename std::enable_if<!std::is_same<T, int>::value, float >::type* = 0)
{
std::cout << "T is not int." << std::endl;
}
};
int main()
{
Point<int> intPoint;
intPoint.MyFunction();
Point<float> floatPoint;
floatPoint.MyFunction();
}
laquelle j'ai pensé est de dire "utiliser la première MyFunction si T est de type int, et l'utilisation de la deuxième MyFunction si T n'est pas de type int, mais j'ai des erreurs de compilation en disant: "erreur: aucun type nommé ‘type’ struct std::enable_if’". Quelqu'un peut-il point de ce que je fais de mal ici?
source d'informationauteur David Doria
Vous devez vous connecter pour publier un commentaire.
enable_if
fonctionne parce que les la substitution d'un modèle argument a entraîné une erreuret donc que la substitution est abandonné à partir de la résolution de surcharge et ne autres viable surcharges sont considérés par le compilateur.Dans votre exemple, il n'y a pas de substitution survenant lors de l'instanciation de l'fonctions de membre parce que l'argument de modèle
T
est déjà connu à l'époque. La façon la plus simple d'obtenir ce que vous êtes est de tenter de créer un mannequin modèle argument qui est, par défaut,T
et l'utiliser pour effectuer SFINAE.Edit:
Comme HostileFork mentionne dans les commentaires, l'exemple d'origine laisse la possibilité à l'utilisateur de spécifier explicitement le modèle des arguments pour les fonctions de membre et d'obtenir un résultat incorrect. Les éléments suivants doivent empêcher explicite les spécialisations des fonctions de membre de la compilation.
Une solution simple consiste à utiliser la délégation des travailleurs privé fonctions:
Quand
T
estint
la premièreworker
fonction sera appelée, parce questatic_cast<T*>(0)
s'avère être de typeint*
. Dans tous les autres cas, la version du modèle de travailleur sera appelée.enable_if
ne fonctionne que pour les déduit modèle de fonction d'arguments ou de classe spécialisée arguments de modèle. Ce que vous faites ne fonctionne pas, parce que, évidemment avec un fixeT = int
la deuxième déclaration est tout simplement erronée.C'est la façon dont il peut être fait:
Une autre solution serait de se spécialiser
Point
de différents typesT
ou pour mettre la fonction dans un imbriquée membre wrapper de modèle (ce qui est probablement le plus "propre" de la solution).Basé sur Prétorienne de la suggestion (mais sans changer le type de retour de la fonction), cela semble fonctionner:
Point modèle à soufflet est possible d'instancier seulement de l'int ou float comme argument de modèle T.
Pour répondre à la question: ici travailleur() est appelée exactement selon le modèle de paramètre de la méthode (), mais encore, vous êtes en contrôle de la types.
Au-dessus de travailleur() de travaux de cours, même s'il est déclaré comme statique. Pour une raison valable. Quelques autres extensions sont possibles (et simple), mais laissez-nous nous en tenir à la réponse.