Maison > développement back-end > C++ > Pourquoi ne puis-je pas utiliser une variable de boucle comme argument de modèle en C ?

Pourquoi ne puis-je pas utiliser une variable de boucle comme argument de modèle en C ?

Patricia Arquette
Libérer: 2024-10-31 01:09:02
original
501 Les gens l'ont consulté

 Why Can't I Use a Loop Variable as a Template Argument in C  ?

Pourquoi les arguments de modèle doivent être des constantes

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.

Explication de l'erreur

Dans le code fourni :

<code class="cpp">for(int i = 0; i < 10; i++) {
    modify<i>();
}</code>
Copier après la connexion

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.

Approche alternative sans changer d'API

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>
Copier après la connexion

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.

Appeler Modify avec une sortie de fonction

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal