Heim  >  Artikel  >  Backend-Entwicklung  >  Warum können wir keinen teilweisen Abzug von Klassenvorlagenargumenten durchführen?

Warum können wir keinen teilweisen Abzug von Klassenvorlagenargumenten durchführen?

Barbara Streisand
Barbara StreisandOriginal
2024-11-18 05:15:02150Durchsuche

Why Can't We Have Partial Class Template Argument Deduction?

Teilweise Ableitung von Klassenvorlagenargumenten: Warum das nicht möglich ist

Frühere Bemühungen, die Ableitung von Vorlagenargumenten für Klassenvorlagen einzuführen, zielten darauf ab, ihr Verhalten an das von Funktionsvorlagen anzupassen. Die Veröffentlichung des P0091-Vorschlags brachte jedoch eine wesentliche Einschränkung ans Licht: Die teilweise Ableitung von Klassenvorlagenargumenten ist weiterhin unmöglich.

Betrachten Sie das bereitgestellte Beispiel, in dem ein Klassenvorlagentest definiert ist. Die Hilfsfunktion „Helper“ vereinfacht die Erstellung von Testobjekten, wie aus dem Codeausschnitt hervorgeht, in dem verschiedene Formen der Argumentableitung demonstriert werden.

Während der Code in den meisten Fällen kompiliert wird, treten beim Versuch einer teilweisen Ableitung für Klassenvorlagen Schwierigkeiten auf. Beispielsweise kann Zeile 6 des folgenden Codes nicht kompiliert werden:

int buffer[5];

test<5> b(buffer);      // Type deduced: FAILS.

Dies liegt daran, dass der Compiler den Typparameter T nicht ermitteln kann. Ohne explizite Angabe erwartet der Compiler, dass alle Vorlagenargumente gleichzeitig abgeleitet werden . Dies stellt eine Herausforderung dar, da sich der Abzugsprozess jedes Parameters auf den Abzug anderer Parameter auswirken kann.

Der Bericht von Botond Ballo hebt die Gründe für diese Einschränkung hervor:

Die ursprünglich vorgeschlagene Funktion war enthalten eine Bestimmung zum teilweisen Abzug, bei der Sie einige der Vorlagenargumente explizit angeben und den Rest ableiten lassen. Dies wurde jedoch aufgrund von Bedenken verschoben, dass es in einigen Fällen sehr verwirrend sein kann Fälle:

// Would have deduced tuple<int, string, float>,
// but tuple<int> is a well-formed type in and of itself!
tuple<int> t(42, "waldo", 2.0f);

Während Funktionsvorlagen einen teilweisen Argumentabzug ermöglichen, führte die Mehrdeutigkeit, die durch den teilweisen Abzug in Klassenvorlagen entsteht, zu dessen Ausschluss.

Das obige ist der detaillierte Inhalt vonWarum können wir keinen teilweisen Abzug von Klassenvorlagenargumenten durchführen?. 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