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;
}
# Java Generics vs. C++ Templates
Posté par michael_acreall . En réponse à la dépêche Java 2 Standard Edition version 5.0. Évalué à 4.
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;
}