Heim >Backend-Entwicklung >C++ >Warum kann ich in C keine Schleifenvariable als Vorlagenargument verwenden?
In C sind Vorlagenargumente auf konstante Ausdrücke beschränkt, da der Compiler ihre Werte während der Kompilierung ermitteln muss. Konstante Ausdrücke sind solche, die ausschließlich auf der Grundlage der zur Kompilierungszeit verfügbaren Informationen ausgewertet werden können, mit Ausnahme von Variablen und Funktionsaufrufen.
Im bereitgestellten Code:
<code class="cpp">for(int i = 0; i < 10; i++) { modify<i>(); }</code>
Das Vorlagenargument i ist kein konstanter Ausdruck, da sein Wert von der Schleifenzählervariablen abhängt, die zur Laufzeit ausgewertet wird. Daher kann der Compiler den Wert von i zur Kompilierungszeit nicht ermitteln und löst einen Fehler aus.
Um Ihr Ziel zu erreichen, ohne die Bibliotheksschnittstelle zu ändern, können Sie eine Technik namens Vorlagen-Metaprogrammierung. Hier ist ein Ansatz:
<code class="cpp">template<int I = 1> void modify_loop() { modify<I>(); modify_loop<I + 1>(); } // Call the recursive function with the starting value modify_loop<>();</code>Dieser Ansatz beginnt mit einer Vorlagenfunktion „modify_loop“, deren Standardwert ich auf 1 gesetzt habe. Innerhalb der Funktion ruft sie „modify“ mit dem aktuellen I-Wert auf und ruft sich dann rekursiv selbst mit „I“ auf erhöht. Die Rekursion wird fortgesetzt, bis ich den gewünschten Wert von 10 erreicht habe.Modify mit einer Funktionsausgabe aufrufenUm Modify aufzurufen, wobei VAR die Ausgabe einer Funktionsberechnung ist, können Sie eine Technik namens Ausdrucksvorlagen
. Hier ist ein Beispiel:
In diesem Beispiel definiert die Func-Struktur ein Funktionsobjekt, das 10 zu seinem Argument hinzufügt. Die VAR-Variable speichert die Ausgabe dieser Funktion und die Änderungsfunktion akzeptiert ein Vorlagenargument eines beliebigen Typs. Indem Sie „modify“ mit VAR instanziieren, übergeben Sie das Ergebnis der Funktion effektiv als Argument.<code class="cpp">struct Func { template<typename T> T operator()(T arg) { return arg + 10; } }; constexpr auto VAR = Func()(); // Evaluate the function and store the result template<typename Value> void modify(Value arg) { ... } // Call modify with VAR as the argument modify(VAR);</code>
Das obige ist der detaillierte Inhalt vonWarum kann ich in C keine Schleifenvariable als Vorlagenargument verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!