• # Java Generics vs. C++ Templates

    Posté par . En réponse à la dépêche Java 2 Standard Edition version 5.0. Évalué à 4.

    Sur le site de Sun on peut lire "A C++ template on the other hand is just a fancy macro processor;"
    Pas seulement, les templates ont ouvert la méta-programmation "statique" à C++.
    En C++, il est possible de créer des types "statiques" conditionnels, C.f. la bibliothèques BOOST sur boost.org, ou le parseur Spirit qui permet ainsi de faire le même boulot que Lex/Yacc directement au moment de la compilation.
    L'emprunt partiel des template à C++, fait par Java ne permet pas de faire les choses suivantes:

    #include
    /**
    * Structure permettant le calcul d'une factorielle lors de la compilation
    * Calcule récursivement la valeur de la factorielle
    * Le code final ne contiendra que le résultat final (un entier)
    */
    template <int N>
    struct Fact {
    static const int m_Value = N * Fact< N - 1 >::m_Value;
    };
    /**
    * Condition d'arret du calcul de la factorielle
    */
    template <>
    struct Fact<0> {
    static const int m_Value = 1;
    };

    /**
    * Exemple de fonction IF en méta programmation
    * On peut remplacer les types de A et B par des classes voire d'autres templates
    * Ici on traite le cas True
    */
    template <int A, int B, bool BOOL>
    struct IF {
    static const int m_Value = A;
    };
    /**
    * Traite le cas False
    */
    template <int A, int B>
    struct IF<A, B, false> {
    static const int m_Value = B;
    };

    int main() {
    int fact10 = Fact<10>::m_Value;
    std::cout << fact10 << std::endl; /* fact10 est remplacé par 3628800 lors de la compilation */
    static const bool VAL_TRUE = true;
    static const bool VAL_FALSE = false;
    std::cout << IF<2,3, VAL_TRUE>::m_Value << std::endl; /* IF<2,3, VAL_TRUE> est remplacé par 2 */
    std::cout << IF<2,3, VAL_FALSE>::m_Value << std::endl; /* IF<2,3, VAL_TRUE> est remplacé par 3 */
    return 0;
    }