In C müssen Vorlagenargumente konstante Ausdrücke sein. Das bedeutet, dass ihre Werte zur Kompilierzeit bekannt sein müssen. Der Compiler kann in diesem Zusammenhang keine nicht konstante Variable auswerten.
Bedenken Sie den Code:
<code class="cpp">template <int a> void modify(){}</code>
Um eine nicht konstante Variable als Vorlagenargument zu übergeben, könnten wir schreiben:
<code class="cpp">for(int i = 0; i < 10; i++) { modify<i>(); }</code>
Dies löst jedoch einen Fehler aus, da der Compiler den Wert von i zur Kompilierungszeit nicht ermitteln kann. Der Schleifenkörper kann mehrmals ausgeführt werden und dabei den Wert von i ändern.
Anstatt eine nicht konstante Variable direkt zu übergeben, können wir zur Implementierung die Vorlagenspezialisierung verwenden ein iterativer Aufruf:
<code class="cpp">#include <iostream> template<> void modify<0>() { std::cout << "modify<0>" << std::endl; } template<> void modify<1>() { std::cout << "modify<1>" << std::endl; } // ... template<int i> void modify() { std::cout << "modify<" << i << ">" << std::endl; modify<i+1>(); } int main() { modify<0>(); }</code>
Um Modify mit einem Wert aufzurufen, der zur Kompilierzeit nicht bekannt ist, können wir eine Technik namens Template-Metaprogrammierung verwenden. Hier ist ein vereinfachtes Beispiel:
<code class="cpp">#include <tuple> template <std::tuple<int...>> struct TupleSize; template <int... Args> struct TupleSize<std::tuple<Args...>> { static const int value = sizeof...(Args); }; template <int N> void callModify(int i) { if constexpr (i < N) { modify<i>(); callModify<N>(i+1); } } int main() { int n = 10; callModify<TupleSize<std::make_tuple(1,2,3,4,5,6,7,8,9,10)>::value>(0); }</code>
In diesem Beispiel verwendet callModify einen Parameter N, der der Größe eines Tupels entspricht, das den gewünschten Wertebereich für i enthält. Die Funktion verwendet ein rekursives Metaprogramm, um die Aufrufe zum Ändern bis zur angegebenen Größe N zu generieren.
Das obige ist der detaillierte Inhalt vonWarum können nicht konstante Variablen in C nicht als Vorlagenargumente verwendet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!