Was ist der Unterschied zwischen den folgenden 2 Teilen des Codes:
1:
%Vor%2:
%Vor%Was ist der Hauptanwendungsfall, um Template-Argumente anstelle von Funktionsargumenten zu verwenden? Warum nicht einfach das zweite Beispiel verwenden?
Was ist der Unterschied zwischen zwei Codeabschnitten?
Template-Argumente müssen Konstanten sein, die zur Kompilierzeit angegeben werden. Funktionsargumente sind Variablen und müssen zum Zeitpunkt der Kompilierung nicht bekannt sein.
Um zu veranschaulichen, mit der Vorlage:
%Vor%während mit Funktionsargumenten:
%Vor%Was ist der Hauptanwendungsfall, um Template-Argumente anstelle von Funktionsargumenten zu verwenden?
Da sie Konstanten sind, können sie eine bessere Optimierung ergeben und können in Situationen (wie der Größe eines Arrays) verwendet werden, in denen nur Konstanten zulässig sind.
Warum nicht einfach das zweite Beispiel verwenden?
In diesem Fall, warum nicht? Das wäre flexibler, da Sie die Argumente zur Laufzeit berechnen oder aus der Eingabe des Programms abrufen können. Wenn es inline ist, sollte es so effizient sein wie die Vorlage, wenn es mit konstanten Werten aufgerufen wird.
Der größte Unterschied ist, was Sie mit diesen beiden Funktionen tun können:
Im Wesentlichen können Sie dies mit der zweiten Funktion tun
%Vor%Dies ist mit der Template-Funktion nicht möglich:
%Vor%Wenn alle Aufrufe konstante Parameter für die Limit-Parameter verwenden, können Sie mit der Template-Funktion einige zusätzliche CPU-Zyklen speichern, da der Compiler die Optimierung besser durchführen kann. Es ist schwer vorstellbar, dass diese zusätzlichen Zyklen einen bedeutenden Unterschied machen würden.
Warum nicht einfach das zweite Beispiel verwenden?
Es gibt Situationen, in denen Sie in Ihrer Funktion eine Kompilierzeitkonstante benötigen. Wenn Sie beispielsweise std::array<len>
basierend auf einem der Parameter deklarieren möchten, muss dieser als Vorlagenparameter und nicht als regulärer Parameter übergeben werden:
Das gleiche würde mit normalen Funktionsparametern nicht funktionieren:
%Vor% Sie können die Vorlage nicht mit Werten aufrufen, die nicht consexpr
sind.
Das einfachste Beispiel wäre etwa so:
1 Kann mit diesem Code aufgerufen werden:
%Vor%Sie müssten 2 für Werte verwenden, die nur zur Laufzeit bekannt sind:
%Vor%