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
Susan Sarandonoriginal
2024-10-29 08:53:30674parcourir

 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>

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!

Déclaration:
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