Maison >développement back-end >C++ >Pourquoi ne puis-je pas utiliser une variable non constante comme argument de modèle en C ?
Lorsque vous tentez de transmettre une variable non constante comme argument de modèle, comme i dans l'extrait de code suivant, le compilateur émet des problèmes une erreur :
<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>
Raison de l'erreur :
Les modèles sont développés lors de la compilation, ce qui nécessite que leurs arguments soient évalués au moment de la compilation. Puisque i est modifié dans la boucle, le compilateur ne peut pas déterminer sa valeur au moment de la compilation, ce qui entraîne l'erreur.
Implémentation alternative :
Pour obtenir l'itération souhaitée sans En modifiant l'interface de l'API, envisagez d'implémenter ce qui suit :
<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>
Cette version utilise la récursivité pour émuler l'itération. En instanciant des fonctions de modèle spécialisées pour chaque valeur (par exemple, modifier<0>, modifier<1>, etc.), le code simule le comportement de la boucle de i=0 à i=9.
Non -Résolution d'argument de modèle constant :
Pour appeler la modification avec un argument variable VAR (déterminé par un calcul fonctionnel), pensez à utiliser une fonction modèle avec des paramètres variadiques, comme suit :
<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>
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!