Maison >développement back-end >C++ >Comment choisir une fonction basée sur les paramètres du modèle à l'aide de activate_if : Pourquoi l'erreur \'aucun type nommé \'type\' dans 'struct std::enable_if'\' se produit-elle et comment peut-elle être résolue ?
Problème :
Déterminer quelle version d'un membre de la classe la fonction doit être appelée en fonction du paramètre de modèle de la classe peut être difficile. L'utilisation d'enable_if peut être une solution, mais vous pouvez rencontrer des erreurs telles que "aucun type nommé 'type' dans 'struct std::enable_if'".
Solution :
Le problème réside dans la substitution des arguments du modèle. Enable_if fonctionne en éliminant les surcharges qui entraînent des erreurs lors de la substitution des arguments du modèle. Dans le code fourni, aucune substitution ne se produit car T est déjà connu au moment de l'instanciation de la fonction membre.
Pour résoudre ce problème, créez un argument de modèle factice par défaut T et utilisez-le pour SFINAE (l'échec de substitution n'est pas Une erreur). Remplacez le code problématique par ce qui suit :
<code class="cpp">template<typename T> struct Point { template<typename U = T> typename std::enable_if<std::is_same<U, int>::value>::type MyFunction() { std::cout << "T is int." << std::endl; } template<typename U = T> typename std::enable_if<std::is_same<U, float>::value>::type MyFunction() { std::cout << "T is not int." << std::endl; } };</code>
Remarque :
Pour empêcher les utilisateurs de spécifier explicitement des arguments de modèle et d'obtenir potentiellement des résultats incorrects, vous pouvez ajouter un code statique assertion aux fonctions membres, comme le montre l'exemple suivant :
<code class="cpp">template<typename T> struct Point { template<typename... Dummy, typename U = T> typename std::enable_if<std::is_same<U, int>::value>::type MyFunction() { static_assert(sizeof...(Dummy)==0, "Do not specify template arguments!"); std::cout << "T is int." << std::endl; } template<typename... Dummy, typename U = T> typename std::enable_if<std::is_same<U, float>::value>::type MyFunction() { static_assert(sizeof...(Dummy)==0, "Do not specify template arguments!"); std::cout << "T is not int." << std::endl; } };</code>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!