Heim > Backend-Entwicklung > C++ > Hauptteil

Warum führt das Vorlagenargument von „std::function' zu Mehrdeutigkeiten bei der Überlastungsauflösung?

Barbara Streisand
Freigeben: 2024-11-06 03:45:02
Original
783 Leute haben es durchsucht

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

Mehrdeutigkeit im Vorlagenargument von Std::Function trotz Definition des Typs

In diesem Szenario sind jeweils mehrere Überladungen für die Funktion „a“ vorhanden Akzeptieren einer eindeutigen Signatur von std::function:

  • function
  • function

The Mehrdeutigkeit entsteht aufgrund der Tatsache, dass beide Funktionen und function sind aus derselben Funktion konstruierbar. Der std::function-Konstruktor, wie in VS2010 definiert, ermöglicht die Konstruktion aus verschiedenen Quellen:

template<class _Fx>
function(_Fx _Func, typename _Not_integral<!...int>::_Type = 0);
Nach dem Login kopieren

Im Wesentlichen kann jedes Objekt in eine std::function konvertiert werden, was das Löschen von Typen erleichtert und die Handhabung von ermöglicht beliebige Objekte als Funktionen.

Um das Problem weiter zu veranschaulichen, betrachten Sie das folgende vereinfachte Beispiel:

template<class Signature>
class myfunc{
   public:
      template<class Func>
      myfunc(Func a_func){
          // ...
      }
};
Nach dem Login kopieren

Wenn während der Überladungsauflösung für 'a' keine brauchbare Überladung identifiziert werden kann, wird der Compiler versucht, die Argumente entweder mit dem Konstruktor des Parameters oder mit dem Konvertierungsoperator des Arguments zu konvertieren. In diesem Fall erfolgt die Konvertierung über den Konstruktor von myfunc.

Da der Konstruktor von myfunc alles akzeptiert, sind sowohl die Funktion und function kann in myfunc konvertiert werden.

Letztendlich führt dies dazu, dass der Compiler nicht bestimmen kann, welche Überladung von „a“ aufgerufen werden soll, was zu Mehrdeutigkeiten führt.

Zu Um dieses Problem zu lösen, haben Sie mehrere Möglichkeiten:

  1. Explizite Umwandlungen beibehalten:
    Eine explizite Umwandlung kann die gewünschte Überladung für den Compiler angeben: a((functionx))
  2. Funktionsobjekte:
    Erstellen Sie Funktionsobjekte des entsprechenden Typs: `function fx = x;
    function fy = y;`
  3. Template-Metaprogrammierung:
    Verwenden Sie Template-Metaprogrammierung, um die richtige Signatur zu erhalten: `template
    struct get_signature{...};`

Das obige ist der detaillierte Inhalt vonWarum führt das Vorlagenargument von „std::function' zu Mehrdeutigkeiten bei der Überlastungsauflösung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage