De nombreux commentaires tentent de différencier les macros et les modèles.
Oui, il s'agit de la même chose : des outils de génération de code.
Les macros sont une forme primitive, sans beaucoup d'application de la part du compilateur (comme faire des objets en C - c'est possible, mais ce n'est pas joli). Les modèles sont plus avancés, et disposent d'un meilleur contrôle de type du compilateur, de messages d'erreur, etc.
Cependant, chacun possède des atouts que l'autre n'a pas.
Les modèles ne peuvent générer que des types de classes dynamiques, alors que les macros peuvent générer presque n'importe quel code (autre qu'une autre définition de macro). Les macros peuvent être très utiles pour intégrer des tableaux statiques de données structurées dans votre code.
Les modèles, quant à eux, permettent d'accomplir des choses vraiment FUNKY qui ne sont pas possibles avec les macros. Par exemple :
template<int d,int t> class Unit
{
double value;
public:
Unit(double n)
{
value = n;
}
Unit<d,t> operator+(Unit<d,t> n)
{
return Unit<d,t>(value + n.value);
}
Unit<d,t> operator-(Unit<d,t> n)
{
return Unit<d,t>(value - n.value);
}
Unit<d,t> operator*(double n)
{
return Unit<d,t>(value * n);
}
Unit<d,t> operator/(double n)
{
return Unit<d,t>(value / n);
}
Unit<d+d2,t+t2> operator*(Unit<d2,t2> n)
{
return Unit<d+d2,t+t2>(value * n.value);
}
Unit<d-d2,t-t2> operator/(Unit<d2,t2> n)
{
return Unit<d-d2,t-t2>(value / n.value);
}
etc....
};
#define Distance Unit<1,0>
#define Time Unit<0,1>
#define Second Time(1.0)
#define Meter Distance(1.0)
void foo()
{
Distance moved1 = 5 * Meter;
Distance moved2 = 10 * Meter;
Time time1 = 10 * Second;
Time time2 = 20 * Second;
if ((moved1 / time1) == (moved2 / time2))
printf("Same speed!");
}
Le modèle permet au compilateur de créer et d'utiliser dynamiquement, à la volée, des instances de modèle sûres du point de vue du type. Le compilateur effectue en fait le calcul des paramètres du modèle au moment de la compilation, en créant des classes distinctes si nécessaire pour chaque résultat unique. Il existe un type implicite Unit<1,-1> (distance / temps = vitesse) qui est créé et comparé dans le conditionnel, mais qui n'est jamais explicitement déclaré dans le code.
Apparemment, quelqu'un dans une université a défini un modèle de ce type avec plus de 40 paramètres (besoin d'une référence), chacun représentant un type d'unité de physique différent. Pensez à la sécurité de type de ce type de classe, juste pour vos chiffres.
1 votes
Pourquoi pensez-vous que la "métaprogrammation de modèles est à la mode" ?
0 votes
Non, ce n'est pas le cas :-) Et votre question est très tendue car les modèles n'aident à résoudre aucun des problèmes que vous mentionnez. Au contraire, ils aident à résoudre une toute autre catégorie de problèmes que vous ignorez commodément. La question présuppose la réponse, et si j'en avais le pouvoir, j'aurais l'intention de la disqualifier parce qu'elle est subjective et argumentée.
0 votes
@Omnifarious - s'agit-il d'un commentaire sur cette question, ou de celui qui a été fusionné avec le mien ? Cette agitation autour d'une question morte depuis un an me fait perdre la tête...
4 votes
La métaprogrammation par modèles est fantastique (elle fait fureur) - je vois au moins un domaine dans la programmation portable de bas niveau. Les gens utilisent la métaprogrammation du préprocesseur (niveau 1) depuis la concaténation des jetons dans ANSI-C, le potentiel est infini avec le mécanisme des modèles de C++ - c'est à la mode ; cependant, nous manquons d'outils, ce qui met un frein à tout cela.