Maison > Article > développement back-end > Pourquoi ne puis-je pas utiliser une variable de boucle comme argument de modèle en C ?
En C, les arguments de modèle sont limités aux expressions constantes car le compilateur doit déterminer leurs valeurs lors de la compilation. Les expressions constantes sont celles qui peuvent être évaluées uniquement sur la base des informations disponibles au moment de la compilation, à l'exclusion des variables et des appels de fonction.
Dans le code fourni :
<code class="cpp">for(int i = 0; i < 10; i++) { modify<i>(); }</code>
L'argument du modèle i n'est pas une expression constante car sa valeur dépend de la variable du compteur de boucle, qui est évaluée lors de l'exécution. Par conséquent, le compilateur ne peut pas déterminer la valeur de i au moment de la compilation et génère une erreur.
Pour atteindre votre objectif sans modifier l'interface de la bibliothèque, vous pouvez utiliser une technique appelée modèle de métaprogrammation. Voici une approche :
<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>
Cette approche commence par une fonction modèle modifier_loop qui a une valeur par défaut que j'ai définie sur 1. À l'intérieur de la fonction, elle appelle modifier avec la valeur I actuelle, puis s'appelle récursivement avec I incrémenté. La récursion continue jusqu'à ce que j'atteigne la valeur souhaitée de 10.
Pour appeler modifier où VAR est la sortie d'un calcul fonctionnel, vous pouvez utiliser une technique appelée modèles d'expression. Voici un exemple :
<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>
Dans cet exemple, la structure Func définit un objet fonction qui ajoute 10 à son argument. La variable VAR stocke la sortie de cette fonction et la fonction de modification accepte un argument de modèle de n'importe quel type. En instanciant la modification avec VAR, vous transmettez effectivement le résultat de la fonction en argument.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!