Question

Existe-t-il des problèmes qui pourraient rendre le système de génération de code T4 Template de MS inutilisable pour générer du code C ++?

Était-ce utile?

La solution

Il peut générer le texte de votre choix, y compris le code C ++.

Autres conseils

Une réponse un peu longue mais je pense que certains pourraient trouver cela intéressant

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

Certains pourraient rétorquer que C ++ a déjà des outils pour faire de la métaprogrammation avec les suivants:

Le préprocesseur

En utilisant le préprocesseur et les macros d'ordre supérieur, vous pouvez réaliser quelque chose de ce que vous pouvez faire avec T4, mais je dis que T4 présente des avantages assez convaincants:

  1. Le code généré à partir de T4 est facile à déboguer et à comprendre
  2. La métaprogrammation avec T4 est plus simple qu'avec le pré-processeur. Le préprocesseur peut faire des macros comme max / min assez facilement mais quand on parle de modèles basés sur des modèles, cela devient difficile
  3. T4 est plus puissant que le préprocesseur, ce qui facilite le développement des modèles
  4. T4 peut être exécuté dans le cadre du processus de construction ou à la demande

Spécialisation des modèles partiels

J'aime beaucoup les trucs partiels de spécialisation de gabarits, mais je parle d'expérience, mais tout le monde n'aime pas les conserver.

Je me suis toujours efforcé de réduire les redondances de code afin d'accroître la facilité de maintenance. De plus, je préfère les erreurs de compilation aux erreurs d’exécution lorsque cela est possible. Ainsi, après la lecture de Modern C ++ par Andrei Alexandrescu, je pensais avoir trouvé la réponse .

J'ai écrit un composant inspiré de ce livre qui a très bien fonctionné, puis je suis parti en vacances. À mon retour, l’équipe avait jeté le composant et réécrit la leur en utilisant des techniques traditionnelles. Il contenait plus de code, était buggier et ne fonctionnait pas aussi bien, mais ils ne savaient pas comment ajouter la fonctionnalité au composant que j'avais écrit et étaient déterminés à le faire. Rien ne pourrait être sauvé. C'étaient des gars intelligents aussi.

Ont-ils eu tort de le faire? En termes de facilité de maintenance, je dirais qu'ils ont fait le bon choix même si cela m'attriste.

Mon propos avec cette anecdote est que T4 présente certains avantages par rapport aux astuces partielles de la spécialisation de modèles:

  1. Le code généré à partir de T4 est facile à déboguer et à comprendre
  2. T4 est plus simple
  3. T4 est plus puissant
  4. T4 peut être exécuté dans le processus de construction ou à la demande
  5. Si les responsables peuvent se familiariser avec le modèle T4, ils peuvent toujours récupérer le code (commencez à gérer le code généré et jetez le modèle). 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èles partiels.

Inconvénients

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

  1. C'est spécifique à Visual Studio (ou spécifique à Mono). Cependant, le code généré peut bien sûr être compilable 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.

Conclusion

Dans l’ensemble, j’ai perdu tout intérêt à utiliser MetaProgramming C ++ avancé en utilisant des astuces sophistiquées avec le préprocesseur ou le système de types (je les utilise cependant pour des tâches plus simples) et je compte sur T4 pour le faire de nos jours.

Si vous souhaitez en savoir plus sur un exemple d'utilisation de C ++, consultez InteractiveGraphics . C'est une bibliothèque pour C #, VB, PowerShell et SmallBasic pour faire de simples graphiques. J'utilise T4 pour générer toutes les API et le code standard pour la transmission 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. Ajouter une nouvelle méthode est alors aussi simple que d'étendre le modèle et de régénérer tous les fichiers temlate, puis j'implémente une méthode abstraite en C ++ et fais ce qui est amusant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top