2008-11-17 18 views

Respuesta

5

Puede generar cualquier texto que desee, incluido el código C++.

+0

Sí. Pregunta tonta, supongo. Aunque vi que puede especificar que el lenguaje de la plantilla sea VB o C#. ¿Esto se relaciona presumiblemente con la compilación automática de la salida de la plantilla? – mackenir

+0

Sus plantillas se generan usando C# o VB, pero no creo que esto tenga nada que ver con la salida. –

7

Un poco largo respuesta todavía creo que algunos podrían encontrar interesante

diría T4 es excelente para generar C++ con

Algunos podrían replicar que C++ ya cuenta con herramientas para hacer metaprogramming con como:

el preprocesador

Usando el preprocesador y macros de orden superior se puede lograr somewha t lo que puede hacer con la T4, pero me dicen que hay algunas ventajas muy convincentes de T4:

  1. El código generado a partir de T4 es fácil de depurar y comprender
  2. metaprogramming con T4 es más sencillo que con el preprocesador. El preprocesador puede hacer macros como máx/mín bastante fácil, pero cuando hablamos de plantillas basados ​​en modelos se hace difícil
  3. T4 es más poderoso que el preprocesador lo que es más fácil desarrollar las plantillas
  4. T4 puede ser ejecutado como parte de la proceso de construcción o bajo demanda

parcial de la plantilla especialización

me encanta trucos plantilla de especialización parciales pero hablo por experiencia que no todo el mundo los quiere mantener.

Siempre me esforcé por reducir las redundancias de código en un esfuerzo por aumentar el mantenimiento. Además, prefiero los errores de tiempo de compilación sobre los errores de tiempo de ejecución cuando sea posible. Entonces, después de leer Modern C++ por Andrei Alexandrescu, pensé que encontré la respuesta .

Escribí un componente inspirado en este libro que funcionó muy bien, luego me fui de vacaciones. Cuando volví, el equipo había descartado el componente y había reescrito el suyo utilizando técnicas tradicionales. Contenía más código, era más complicado y no funcionaba tan bien, pero no podían encontrar la manera de agregar la funcionalidad al Componente que había escrito y determinaron que tenían que hacer esto. Nada podría ser rescatado. Estos eran tipos inteligentes también.

¿Se equivocaron al hacerlo? En términos de mantenibilidad, diría que hicieron la elección correcta, aunque me entristece.

Mi punto con este anechdote es que la T4 tiene algunas ventajas sobre trucos plantilla de especialización parciales:

  1. El código generado a partir de T4 es fácil de depurar y comprender
  2. T4 es más simple
  3. T4 es más poderosa
  4. T4 se puede ejecutar como parte del proceso de compilación o bajo demanda
  5. Si los mantenedores pueden familiarizarse con la plantilla T4, pueden rescatar el código (start mai) mantener el código generado y tirar la plantilla). Eso no fue posible en el anechdote de arriba.

Por supuesto, en C++ MetaProgramming es una combinación del preprocesador y la especialización de plantillas parciales.

Inconvenientes

hay inconvenientes con T4, por supuesto;

  1. Es Visual Studio específico (o Mono específico). Sin embargo, el código generado puede ser compilado por GCC y otros.
  2. Es no estándar
  3. Visual Studio no parece C++ Projects para apoyar T4, que me obliga a utilizar un proyecto .NET ficticia para generar el código frmo.

Concluyendo

en general me he perdido el interés haciendo avanzada metaprogramming C++ usando trucos de fantasía con el preprocesador o el sistema de tipos (hago uso de ellos para las tareas más simples aunque) y se basa en la T4 de eso en estos días.

Si alguien está interesado en una muestra sobre cómo hacerlo en C++, puede consultar InteractiveGraphics. Es una biblioteca para C#, VB, PowerShell y SmallBasic para hacer gráficos simples. Ahí utilizo T4 para generar todas las API y el código repetitivo para el envío de mensajes entre .NET y C++ (no uso C++/CLI si puedo evitarlo) todo) de un Modelo que describe la API. Agregar un nuevo método es tan simple como extender el modelo y regenerar todos los archivos de temlate, luego implementar un método abstracto en C++ y hacer las cosas divertidas.

+0

Gracias - un ejemplo de generación de C++ usando T4 prácticamente responde mi pregunta con un Sí :). – mackenir

Cuestiones relacionadas