Beim Versuch, eine nicht konstante Variable als Vorlagenargument zu übergeben, wie z. B. i im folgenden Codeausschnitt, tritt beim Compiler ein Problem auf ein Fehler:
<code class="cpp">template <int a> void modify() {} for (int i = 0; i < 10; i++) { modify<i>(); // error: 'i' cannot appear in constant-expression }</code>
Grund für den Fehler:
Vorlagen werden während der Kompilierung erweitert, was erfordert, dass ihre Argumente zur Kompilierungszeit ausgewertet werden. Da i innerhalb der Schleife geändert wird, kann der Compiler seinen Wert zur Kompilierungszeit nicht ermitteln, was zu dem Fehler führt.
Alternative Implementierung:
Um die gewünschte Iteration ohne zu erreichen Wenn Sie die API-Schnittstelle ändern, sollten Sie Folgendes implementieren:
<code class="cpp">#include <iostream> template<int i> void modify() { std::cout << "modify<" << i << ">" << std::endl; } template<int x, int to> struct static_for { void operator()() { modify<x>(); static_for<x+1,to>()(); } }; template<int to> struct static_for<to,to> { void operator()() {} }; int main() { static_for<0,10>()(); }</code>
Diese Version nutzt Rekursion, um die Iteration zu emulieren. Durch die Instanziierung spezieller Vorlagenfunktionen für jeden Wert (z. B. modifizieren<0>, modifizieren<1> usw.) simuliert der Code das Schleifenverhalten von i=0 bis i=9.
Nein -Konstante Vorlagenargumentauflösung:
Um „modify“ mit einem variablen Argument VAR (bestimmt durch eine Funktionsberechnung) aufzurufen, sollten Sie die Verwendung einer Vorlagenfunktion mit variadischen Parametern wie folgt in Betracht ziehen:
<code class="cpp">template <typename T> void modify(const T& x) { std::cout << "modify(" << x << ")" << std::endl; } int main() { auto VAR = ...; // computed from some functional process modify(VAR); }</code>
Das obige ist der detaillierte Inhalt vonWarum kann ich in C keine nicht konstante Variable als Vorlagenargument verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!