J'ai un code comme
template <size_t N>
class A
{
template <size_t N>
someFunctions() {};
};
Maintenant, je veux créer des instances de la classe et appeler les fonctions dans une boucle for pour un ensemble de nombreuses valeurs comme
// in main()
int main()
{
for (int i = 1; i <= 100; i++)
{
const int N = i; // dont know how to do this
A<N> a;
a.functionCalls();
}
}
Comment faire ça? En espérant une méthode pour le faire.
c++
for-loop
templates
compile-time-constant
template-classes
nachiappan venkatesh
la source
la source
N
doit l'être,constexpr
s'il s'agit d'une variable de boucle, ce qui n'est pas le casRéponses:
Cela nécessiterait quelque chose appelé a
template for
qui est la forme attendue des instructions d'expansion , qui ressemble à une boucle for mais qui est en réalité un modèle de bloc dans une fonction qui est instanciée plusieurs fois.Bien sûr, il existe une solution de contournement. Nous pouvons abuser de lambdas génériques pour déclarer une sorte de bloc de modèle local et l'instancier nous-mêmes:
Cette fonction prend une séquence entière et instancie le lambda
F
autant de fois que la longueur de la séquence.Il est utilisé comme ceci:
Ici,
N
peut être envoyé en tant que paramètre de modèle car c'est un objet qui a un opérateur de conversion constexpr en un type entier. Plus précisément, c'est unstd::integral_constant
avec une valeur croissante.Exemple en direct
la source
static_cast<void>
?f
retourne un type qui surcharge l'opérateur virguletemplate for
. Abuser des constructions linguistiques comme celle-ci est toujours plus douloureuxIl
N
doit être constant au moment de la compilation, ce qui estfor
impossible avec une boucle normale .Mais, il existe de nombreuses solutions de contournement. Par exemple, inspiré par cette publication SO , vous pouvez faire quelque chose comme ceci. ( Voir une démo en direct )
Imprime
1
à100
En c ++ 17 , ce qui précède peut être réduit à une seule
AGenerator
classe de modèle (c'est-à-dire que la spécialisation peut être évitée), en utilisantif constexpr
. ( Voir une démo en direct )Sortie :
En cas de fournir la plage d'itération, vous pouvez utiliser ce qui suit. ( Voir une démo en direct )
Produit la même chose que la version ci-dessus.
la source
À partir de C ++ 20, vous pouvez utiliser des modèles lambdas, vous pouvez donc essayer quelque chose comme suit
Voici un exemple complet de compilation qui imprime tous les nombres de 0 à 99
la source
Une façon de le faire est d'utiliser la méta-programmation de modèle avec quelque chose comme ceci:
la source
Juste pour être complet - est-il vraiment nécessaire que la classe ou la fonction soit modélisée, si le seul usage de la fonction doit être appelé depuis la boucle?
Si c'est le cas et que vous ne voulez pas écrire à la main, regardez boost.hana.
la source