Heim >Backend-Entwicklung >C++ >Warum kann ich in C keine Schleifenvariable als Vorlagenargument verwenden?

Warum kann ich in C keine Schleifenvariable als Vorlagenargument verwenden?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-31 01:09:02494Durchsuche

 Why Can't I Use a Loop Variable as a Template Argument in C  ?

Warum Vorlagenargumente Konstanten sein müssen

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.

Erklärung des Fehlers

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.

Alternativer Ansatz ohne Änderung der API

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 aufrufen

Um 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!

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