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

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

Susan Sarandon
Libérer: 2024-10-29 08:53:30
original
715 Les gens l'ont consulté

 Why can't I use a non-constant variable as a template argument in C  ?

Énigme des arguments de modèle non constants

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

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

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

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!

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