• [^] # Re: Je m'y colle...

    Posté par . 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 factorial qui dépend d'un paramètre template qui est un entier :

    template <std::size_t N>
    struct factorial
    {
    };

    À l'intérieur tu définis le cas général :

    static constexpr std::size_t value = RangeN * factorial<RangeN - 1>::value;

    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 :

    template<>
    struct factorial<0u>
    {
     constexpr static std::size_t value = 1u;
    };

    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 :

    #include <iostream>
    template <std::size_t RangeN>
    struct factorial
    {
     static constexpr std::size_t value = RangeN * factorial<RangeN - 1>::value;
    };
    template<>
    struct factorial<0u>
    {
     constexpr static std::size_t value = 1u;
    };
    int main()
    {
     std::cout << factorial<0>::value << "\n";
     std::cout << factorial<4>::value << "\n";
    }

    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.