Maison > développement back-end > C++ > Pourquoi l'argument de modèle de « std::function » conduit-il à une ambiguïté dans la résolution de surcharge ?

Pourquoi l'argument de modèle de « std::function » conduit-il à une ambiguïté dans la résolution de surcharge ?

Barbara Streisand
Libérer: 2024-11-06 03:45:02
original
817 Les gens l'ont consulté

Why Does `std::function`'s Template Argument Lead to Ambiguity in Overload Resolution?

Ambiguïté résidant dans l'argument de modèle de Std :: Function malgré la définition du type

Dans ce scénario, plusieurs surcharges existent pour la fonction « a », chacune acceptant une signature distincte de std::function:

  • function
  • function

Le l'ambiguïté surgit du fait que les deux fonctions et fonction sont constructibles à partir de la même fonction. Le constructeur std::function, tel que défini dans VS2010, permet la construction à partir de diverses sources :

template<class _Fx>
function(_Fx _Func, typename _Not_integral<!...int>::_Type = 0);
Copier après la connexion

Essentiellement, n'importe quel objet peut être converti en std::function, facilitant l'effacement de type et permettant la gestion de objets arbitraires en tant que fonctions.

Pour illustrer davantage le problème, considérons l'exemple simplifié suivant :

template<class Signature>
class myfunc{
   public:
      template<class Func>
      myfunc(Func a_func){
          // ...
      }
};
Copier après la connexion

Pendant la résolution de surcharge pour « a », si une surcharge viable ne peut pas être identifiée, le compilateur tente de convertir les arguments en utilisant soit le constructeur du paramètre, soit l'opérateur de conversion de l'argument. Dans ce cas, la conversion s'effectue via le constructeur de myfunc.

Puisque le constructeur de myfunc accepte tout, les deux fonctions et fonction peut être converti en myfunc.

En fin de compte, cela a pour conséquence que le compilateur est incapable de déterminer quelle surcharge de 'a' invoquer, ce qui conduit à l'ambiguïté.

Pour pour résoudre ce problème, vous avez plusieurs options :

  1. Maintenir les conversions explicites :
    Une conversion explicite peut spécifier la surcharge souhaitée pour le compilateur : a((functionx))
  2. Objets de fonction :
    Créez des objets de fonction du type approprié : `function fx = x;
    fonction fy = y;`
  3. Métaprogrammation de modèle :
    Utiliser la métaprogrammation de modèle pour obtenir la signature correcte : `template
    struct get_signature{...};`

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