In C sind Standardvorlagenargumente nur für Klassenvorlagen, nicht jedoch für Funktionsvorlagen zulässig. Diese Einschränkung mag überraschend erscheinen, es gibt jedoch mehrere Gründe dafür.
Standardvorlagenargumente ermöglichen es Klassenvorlagen, einen Standardwert für bestimmte Parameter bereitzustellen. Dies kann nützlich sein, wenn sich der Standardwert für die meisten Instanzen der Vorlage wahrscheinlich nicht ändern wird. Beispielsweise könnte eine Klassenvorlage für einen Sortieralgorithmus ein Standardvorlagenargument für die beim Sortieren verwendete Vergleichsfunktion haben.
Standardvorlagenargumente sind jedoch für Funktionen nicht zulässig Vorlagen, da sie zu Mehrdeutigkeiten führen würden. Betrachten Sie das folgende hypothetische Beispiel:
<code class="cpp">struct my_class { template<class T = int> void mymember(T* vec) { // ... } };</code>
In diesem Beispiel wäre unklar, ob T der Standardtyp für die Funktion „mymember“ oder für die Vorlage „my_class“ selbst ist. Diese Mehrdeutigkeit könnte zu subtilen Fehlern im Code führen.
Vor C 11 war das Verbot von Standardvorlagenargumenten für Funktionsvorlagen eine erhebliche Einschränkung. Mit C 11 wurde jedoch eine neue Funktion namens „Typ-Aliase“ eingeführt, die es uns ermöglicht, Aliase für Typen zu definieren. Dies bietet eine Problemumgehung für das Fehlen von Standardvorlagenargumenten für Funktionsvorlagen. Das obige Beispiel könnte beispielsweise wie folgt umgeschrieben werden:
<code class="cpp">struct my_class { typedef int default_type; template<class T = default_type> void mymember(T* vec) { // ... } };</code>
Typaliase sind zwar nicht so praktisch wie Standardvorlagenargumente, bieten aber eine ähnliche Funktionalität und ermöglichen es uns, die Einschränkungen des aktuellen C-Standards zu überwinden .
In einem Fehlerbericht äußerte Bjarne Stroustrup, der ursprüngliche Designer von C, seine Meinung zum Verbot von Standardvorlagenargumenten für Funktionsvorlagen:
Das Verbot von Standard-Vorlagenargumenten für Funktionsvorlagen ist ein missbräuchliches Überbleibsel aus der Zeit, in der freistehende Funktionen als Bürger zweiter Klasse behandelt wurden und verlangte, dass alle Vorlagenargumente aus den Funktionsargumenten abgeleitet und nicht spezifiziert werden mussten.
Das obige ist der detaillierte Inhalt vonWarum sind Standardvorlagenargumente in C auf Klassenvorlagen beschränkt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!