Template Argument Constant Evaluation
1. Warum kann der Compiler „i“ nicht zur Kompilierungszeit auswerten?
Die Auswertung zur Kompilierungszeit erfordert, dass der Wert von „i“ bekannt ist, bevor das Programm ausgeführt wird. Im bereitgestellten Code ist „i“ jedoch eine Schleifenvariable, die sich während der Programmausführung ändert. Der Compiler kann den Wert von „i“ zur Kompilierungszeit nicht ermitteln, da es sich um einen dynamisch zugewiesenen Wert handelt.
2. Kann ich das Ziel erreichen, ohne die API-Schnittstelle zu ändern?
Ja, Sie können die Vorlagenspezialisierung verwenden, um eine rekursive Funktion zu erstellen, die den Bereich der Vorlagenargumente durchläuft. Sie könnten beispielsweise eine Funktion erstellen:
<code class="cpp">template<int i> void modify_recursive() { // Call modify with template argument 'i' modify<i>(); // Recursively call modify_recursive with the next template argument if (i < 10) { modify_recursive<i + 1>(); } }</code>
„ändern“ mit einem nicht konstanten Argument aufrufen
„ändern“ mit einem Wert aufrufen, der ist Da es sich nicht um eine Konstante zur Kompilierungszeit handelt, können Sie eine Technik namens Template-Metaprogrammierung verwenden. Ein Ansatz besteht darin, eine Vorlagenklasse zu erstellen, die ein Funktionsobjekt als Argument verwendet und es mit dem gewünschten Wert aufruft:
<code class="cpp">template<typename F> struct InvokeWithParam { InvokeWithParam(F f, int param) : f(f), param(param) {} void operator()() { f(param); } F f; int param; };</code>
Sie können dann eine Instanz von InvokeWithParam als Vorlagenargument zum Ändern übergeben:
<code class="cpp">int var = 5; modify<InvokeWithParam{modify, var}>();</code>
Dadurch wird die Änderungsfunktion mit dem Wert von var aufgerufen.
Das obige ist der detaillierte Inhalt vonWie kann ich mit Vorlagenargumenten eine konstante Auswertung erreichen, wenn das Argument zum Zeitpunkt der Kompilierung nicht bekannt ist?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!