Heim >Backend-Entwicklung >C++ >Wie bestimmt die teilweise Reihenfolge von C 11 spezialisiertere Funktionsvorlagen?

Wie bestimmt die teilweise Reihenfolge von C 11 spezialisiertere Funktionsvorlagen?

Susan Sarandon
Susan SarandonOriginal
2024-12-05 10:37:10695Durchsuche

How Does C  11's Partial Ordering Determine More Specialized Function Templates?

Teilweise Reihenfolge bei der Ableitung von Funktionsvorlagen

Problem:

Der C 11-Standard beschreibt a Teilweises Bestellverfahren zum Vergleich der Spezialisierung von Funktionsvorlagen, dessen Bedeutung jedoch nicht ganz klar ist. Können Sie eine Erklärung mit Beispielen geben?

Antwort:

Um festzustellen, ob eine Funktionsvorlage spezialisierter ist als eine andere, verwendet der Standard ein Teilreihenfolgeverfahren. Dieses Verfahren umfasst das Erstellen transformierter Funktionstypen für jede Vorlage und deren Vergleich, um festzustellen, welche Vorlage spezialisierter ist.

Schritt 1: Transformierte Funktionstypen erstellen

Für jede Vorlage: Ein transformierter Funktionstyp wird erstellt, indem Typparameter durch bestimmte Typen (sogenannte synthetisierte Typen) ersetzt werden. Diese synthetisierten Typen sind eindeutig und werden an keiner anderen Stelle im Code verwendet.

Schritt 2: Transformierte Typen den Originalvorlagen zuordnen

Der transformierte Funktionstyp der ersten Vorlage wird abgeglichen gegen den ursprünglichen Funktionstyp der zweiten Vorlage. Der Vorgang wird dann in umgekehrter Richtung wiederholt.

Schritt 3: Spezialisierung bestimmen

Wenn eine Transformation eine Übereinstimmung erzeugt und die andere nicht, wird die Vorlage mit der übereinstimmenden umgewandelt Transformation gilt als spezialisierter. Wenn in keiner Richtung eine Übereinstimmung gefunden wird, gilt keine der Vorlagen als spezialisierter als die andere.

Beispiel:

Betrachten Sie zwei Funktionsvorlagen:

template<typename T, typename U>
void foo(T, U); // #1

template<typename T>
void foo(T const*, X<T>); // #2

Das Abgleichen des transformierten Funktionstyps von #1b (void foo(int, bool)) mit dem ursprünglichen Funktionstyp von #2 (#2) schlägt fehl. Der Abgleich des transformierten Funktionstyps von #2b (void foo(char const*, ist spezialisierter als Funktionsvorlage Nr. 1.

Zusätzlicher Hinweis:

Dieses Teilbestellverfahren ist Wird auch verwendet, um die Spezialisierung partieller Klassenvorlagenspezialisierungen zu vergleichen. In diesem Fall besteht das Verfahren darin, zunächst fiktive Funktionsvorlagen für jede Spezialisierung zu erstellen und diese Funktionsvorlagen dann nach denselben Regeln zu vergleichen.

Das obige ist der detaillierte Inhalt vonWie bestimmt die teilweise Reihenfolge von C 11 spezialisiertere Funktionsvorlagen?. 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