2008-11-17 17 views

Répondre

5

Il peut générer n'importe quel texte, y compris du code C++.

+0

Oui. Question idiote je suppose. Bien que j'ai vu que vous pouvez spécifier que la langue de modèle est VB ou C#. Cela se rapporte probablement à la compilation automatique de la sortie du modèle? – mackenir

+0

Vos modèles sont générés en utilisant C# ou VB mais je ne pense pas que cela ait quelque chose à voir avec la sortie. –

7

Un peu longue réponse mais je pense que certains pourraient trouver intéressant

Je dirais T4 est excellent pour générer C++ avec

Certains pourraient rétorquer que C++ a déjà des outils pour faire Méta avec comme:

préprocesseur

Utilisation du préprocesseur et les macros d'ordre supérieur, vous pouvez obtenir somewha t ce que vous pouvez faire avec T4, mais je dis qu'il ya des avantages très convaincants de T4:

  1. Le code généré à partir T4 est facile à déboguer et à comprendre
  2. Méta avec T4 est plus simple que le préprocesseur. Le préprocesseur peut faire des macros comme max/min assez facile, mais quand on parle de modèles orienté modèle, il devient difficile
  3. T4 est plus puissant que le préprocesseur qui rend plus facile de développer les modèles
  4. T4 peut être exécutée dans le cadre du processus de construction ou à la demande

spécialisation modèle partiel

J'aime des trucs de spécialisation de modèle partiel mais je parle d'expérience que tout le monde aime les maintenir.

Je me suis toujours efforcé de réduire les redondances de code dans le but d'augmenter la maintenabilité. En outre, je préfère les erreurs de compilation sur les erreurs d'exécution lorsque cela est possible. Donc, après avoir lu Modern C++ par Andrei Alexandrescu je pensais que j'ai trouvé la réponse .

J'ai écrit un composant inspiré par ce livre qui a bien fonctionné, puis je suis parti en vacances. Quand je suis revenu, l'équipe avait jeté le composant et réécrit le leur en utilisant des techniques traditionnelles. Il contenait plus de code, était buggier et ne fonctionnait pas aussi bien mais ils ne pouvaient pas comprendre comment ajouter la fonctionnalité au composant que j'avais écrit et déterminé qu'ils devaient le faire. Rien ne pourrait être sauvé. Ce sont des gars intelligents aussi.

Aviez-vous tort de le faire? En termes de maintenabilité, je dirais qu'ils ont fait le bon choix même si cela m'attriste.

Mon point avec ce anechdote est que T4 a quelques avantages par rapport aux tours de spécialisation de modèle partiel:

  1. Le code généré à partir T4 est facile à déboguer et à comprendre
  2. T4 est plus simple
  3. T4 est plus puissant
  4. T4 peut être exécuté une partie de l'accumulation processus ou à la demande
  5. Si les mainteneurs peuvent obtenir leur tête autour du modèle T4 ils peuvent encore récupérer le code (début mai retirer le code généré et jeter le gabarit). Ce n'était pas possible dans l'anechdote ci-dessus.

Bien sûr, en C++, MetaProgramming est une combinaison du préprocesseur et de la spécialisation de modèle partielle.

Désavantages

Il y a des inconvénients avec T4 bien sûr;

  1. Il est spécifique à Visual Studio (ou spécifique à Mono). Cependant, le code généré peut bien sûr être compilé par GCC et d'autres.
  2. Il est non-standard
  3. Les projets Visual Studio C++ ne semblent pas prendre en charge T4, ce qui me force à utiliser un projet .NET factice pour générer le code frmo.

Emballage jusqu'à

Dans tout ce que j'ai perdu tout intérêt à faire avancé Méta C++ en utilisant des astuces de fantaisie avec le préprocesseur ou le système de type (je les utiliser pour des tâches plus simples cependant) et repose sur T4 que ces jours-ci.

Si quelqu'un est intéressé par un exemple sur la façon de le faire en C++, vous pouvez consulter InteractiveGraphics. C'est une bibliothèque pour C#, VB, PowerShell et SmallBasic pour faire des graphiques simples. Là j'utilise T4 pour générer toutes les API et le code standard pour le passage de messages entre .NET et C++ (je n'utilise pas C++/CLI si je peux l'éviter all) à partir d'un modèle décrivant l'API. L'ajout d'une nouvelle méthode est alors aussi simple que l'extension du modèle et la régénération de tous les fichiers temlate, puis j'implémente une méthode abstraite en C++ et fais les choses amusantes.

+0

Merci - un exemple de génération C++ en utilisant T4 répond à peu près à ma question avec un Oui :). – mackenir