Pregunta

¿Hay algún problema que pueda hacer que el sistema de generación de código de plantilla T4 de MS no sea adecuado para generar código C ++?

¿Fue útil?

Solución

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

Otros consejos

Una respuesta un poco larga pero creo que algunos podrían encontrarla interesante

Diría que T4 es excelente para generar C ++ con

Algunos podrían replicar que C ++ ya tiene herramientas para hacer MetaProgramming con:

El preprocesador

Usando el preprocesador y las macros de orden superior, puede lograr algo de lo que puede hacer con T4, pero digo que hay algunos beneficios bastante convincentes de T4:

  1. El código generado desde T4 es fácil de depurar y comprender
  2. MetaProgramming con T4 es más simple que con el preprocesador. El preprocesador puede hacer macros como max / min lo suficientemente fácil, pero cuando hablamos de plantillas controladas por modelos, se vuelve difícil
  3. T4 es más potente que el preprocesador, lo que facilita el desarrollo de las plantillas
  4. T4 se puede ejecutar como parte del proceso de compilación o bajo demanda

Especialización de plantilla parcial

Me encantan los trucos parciales de especialización de plantillas, pero hablo por experiencia de que no a todos les encanta mantenerlos.

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

Escribí un componente inspirado en este libro que funcionó muy bien, luego me fui de vacaciones. Cuando regresé, el equipo había desechado el componente y reescribió el suyo usando técnicas tradicionales. Contenía más código, tenía errores y no funcionaba tan bien, sin embargo, no podían imaginar cómo agregar la funcionalidad al Componente que había escrito y determinaron que tenían que hacer esto. Nada podría ser salvado. Estos también eran tipos inteligentes.

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

Mi punto con esta anécdota es que T4 tiene algunos beneficios sobre los trucos parciales de especialización de plantillas:

  1. El código generado desde T4 es fácil de depurar y comprender
  2. T4 es más simple
  3. T4 es más poderoso
  4. T4 se puede ejecutar como parte del proceso de compilación o bajo demanda
  5. Si los mantenedores pueden entender la plantilla T4, aún pueden recuperar el código (comience a mantener el código generado y deseche la plantilla). Eso no fue posible en la anécdota anterior.

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

Drawbacks

Hay inconvenientes con T4, por supuesto;

  1. Es específico de Visual Studio (o específico de Mono). Sin embargo, el código generado puede, por supuesto, ser compilado por GCC y otros.
  2. No es estándar
  3. Los proyectos de Visual Studio C ++ no parecen admitir T4, lo que me obliga a usar un proyecto .NET ficticio para generar el código frmo.

Finalización

En general, he perdido interés en hacer MetaProgramming C ++ avanzado usando trucos sofisticados con el PreProcesador o el sistema de tipos (aunque los uso para tareas más simples) y confío en T4 para 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. Allí uso T4 para generar todas las API y el código repetitivo para el paso de mensajes entre .NET y C ++ (no uso C ++ / CLI si puedo evitarlo). todos) 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 plantilla, luego implemento un método abstracto en C ++ y hago las cosas divertidas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top