Heim > Backend-Entwicklung > C++ > Hauptteil

Warum kann ich in C keine Schleifenvariable als Vorlagenargument verwenden?

Patricia Arquette
Freigeben: 2024-10-31 01:09:02
Original
413 Leute haben es durchsucht

 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>
Nach dem Login kopieren

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>
Nach dem Login kopieren
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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!