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 ?

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 ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-26 12:00:05631parcourir

How to Choose a Function Based on Template Parameters Using enable_if: Why does the

Comment choisir une fonction en fonction des paramètres du modèle à l'aide d'Enable_if

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn