„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Beeinflusst das Template-Argument von „std::function“ seinen Typ während der Objektkonstruktion?

Beeinflusst das Template-Argument von „std::function“ seinen Typ während der Objektkonstruktion?

Veröffentlicht am 13.12.2024
Durchsuche:997

Does the Template Argument of `std::function` Influence its Type During Object Construction?

Ist das Vorlagenargument von std::function in seinem Typ enthalten?

Problemeinführung

Bei Verwendung der std::function-Vorlage Mehrdeutigkeit kann aufgrund mehrerer plausibler Überlastungen entstehen. Betrachten Sie insbesondere den folgenden Codeausschnitt:

#include 

using namespace std;

int a(const function& f) { return f(); }
int a(const function& f) { return f(0); }
int x() { return 22; }
int y(int) { return 44; }

int main() {
    a(x); // Call is ambiguous.
    a(y); // Call is ambiguous.
}

Die Mehrdeutigkeit ergibt sich aus der Tatsache, dass sowohl function als auch function aus einem generischen Funktionszeiger konstruiert werden können. Dies führt zu mehreren potenziellen Übereinstimmungen für Überladungen der Funktion a.

Mehrdeutigkeitsauflösung

Die Signatur des Vorlagenarguments für std::function wird während der Deklaration und Definition als Teil seines Typs betrachtet. Dies ist jedoch während der Objektkonstruktion nicht der Fall.

std::function verwendet wie viele funktionale Objekte in C eine Technik namens Typlöschung. Dies ermöglicht die Annahme beliebiger Objekte oder Funktionen, sofern diese beim Aufruf die erwartete Signatur erfüllen. Der Nachteil besteht darin, dass Fehler im Zusammenhang mit nicht übereinstimmenden Signaturen tief in der Implementierung und nicht auf der Konstruktorebene auftreten.

Mehrdeutigkeit umgehen

Es gibt drei Hauptoptionen, um diese Mehrdeutigkeit zu umgehen:

  • Explizite Typumwandlung: Wandeln Sie die Funktionszeiger manuell in die spezifische Signatur um, die für den beabsichtigten Zweck erforderlich ist Überladung.
  • Function Object Wrapping: Erstellen Sie ein Funktionsobjekt des entsprechenden Typs und übergeben Sie dieses stattdessen.
  • Template Metaprogramming (TMP): Verwenden TMP, um eine Funktion mit der gewünschten Signatur zu generieren und explizite Umwandlungen zu vermeiden.

Schlussfolgerung

Während die Das Vorlagenargument von std::function bestimmt seinen Typ bei Deklarationen und Definitionen, es spielt bei der Objektkonstruktion keine Rolle. Dies kann zu Mehrdeutigkeiten führen, wenn Konstruktoren beliebige Argumente akzeptieren. Um dieses Problem zu lösen, können Programmierer explizite Typumwandlung, Funktionsobjektumbruch oder TMP verwenden.

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3