Heim  >  Artikel  >  Backend-Entwicklung  >  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?

DDD
DDDOriginal
2024-11-05 22:35:02566Durchsuche

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 Vorlage std::function kommt es zu Mehrdeutigkeiten kann aufgrund mehrerer plausibler Überlastungen entstehen. Betrachten Sie insbesondere den folgenden Codeausschnitt:

<code class="cpp">#include <functional>

using namespace std;

int a(const function<int()>& f) { return f(); }
int a(const function<int(int)>& 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.
}</code>

Die Mehrdeutigkeit ergibt sich aus der Tatsache, dass beide Funktionen und function kann aus einem generischen Funktionszeiger erstellt werden. Dies führt zu mehreren potenziellen Übereinstimmungen für Überladungen der a-Funktion.

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 bei der Objektkonstruktion nicht der Fall.

std::function verwendet wie viele funktionale Objekte in C eine Technik namens Typlöschung. Dadurch kann es beliebige Objekte oder Funktionen akzeptieren, 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 Konstruktorebene auftreten.

Umgehung von Mehrdeutigkeiten

Es gibt drei Hauptoptionen zur Umgehung dieser Mehrdeutigkeit:

  • Explizite Typumwandlung: Wandeln Sie die Funktionszeiger manuell in die spezifische Signatur um, die für die beabsichtigte Überladung erforderlich ist.
  • Funktionsobjektumbruch: Erstellen Sie ein Funktionsobjekt von Geben Sie den entsprechenden Typ ein und übergeben Sie diesen stattdessen.
  • Template Metaprogramming (TMP): Verwenden Sie TMP, um eine Funktion mit der gewünschten Signatur zu generieren, und vermeiden Sie explizite Umwandlungen.

Fazit

Während das Vorlagenargument von std::function seinen Typ bei Deklarationen und Definitionen bestimmt, spielt es 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.

Das obige ist der detaillierte Inhalt vonBeeinflusst das Template-Argument von „std::function“ seinen Typ während der Objektkonstruktion?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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