constexpr veut dire que c'est calculé à la compilation. C'est faisable puisqu'on a toutes les infos à la compilation. Le code est simple, value est égal au rang actuel multiplié par factorielle du rang moins un.
Comme dans toute programmation récursive (la programmation fonctionnelle se fait en récursion), il faut une condition d'arrêt :
factorial<0>::value et factorial<4>::value sont connus à la compilation, rien n'est calculé au runtime.
Cet exemple là n'est pas très utile, mais il existe des cas où ces technique améliorent beaucoup la rapidité du code en précalculant des choses à la compilation. Glander sur http://stackoverflow.com/questions/tagged/metaprogramming%20c%2b%2b peut donner quelques exemples d'application.
Ce commentaire est libre de droit, vous pouvez le réutiliser comme bon vous semble.
[^] # Re: Je m'y colle...
Posté par Morovaille . En réponse à la dépêche C++17 branche à la compilation (`if constexpr`). Évalué à 6. Dernière modification le 06 décembre 2016 à 10:05.
C'est de la programmation fonctionnelle à la compilation. Un bon exemple est la fonction factorielle.
Tu définis une structure
factorialqui dépend d'un paramètre template qui est un entier :À l'intérieur tu définis le cas général :
constexprveut dire que c'est calculé à la compilation. C'est faisable puisqu'on a toutes les infos à la compilation. Le code est simple,valueest égal au rang actuel multiplié par factorielle du rang moins un.Comme dans toute programmation récursive (la programmation fonctionnelle se fait en récursion), il faut une condition d'arrêt :
La valeur de factorielle de 0 est un. C'est ici que la récursion s'arrête.
Un programme complet pour montrer le code :
factorial<0>::valueetfactorial<4>::valuesont connus à la compilation, rien n'est calculé au runtime.Cet exemple là n'est pas très utile, mais il existe des cas où ces technique améliorent beaucoup la rapidité du code en précalculant des choses à la compilation. Glander sur http://stackoverflow.com/questions/tagged/metaprogramming%20c%2b%2b peut donner quelques exemples d'application.
Ce commentaire est libre de droit, vous pouvez le réutiliser comme bon vous semble.