Maison > développement back-end > C++ > le corps du texte

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
Libérer: 2024-10-26 12:00:05
original
562 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!