Plantillas T4: ¿adecuadas para generar código C ++?
-
08-07-2019 - |
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 ++?
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:
- El código generado desde T4 es fácil de depurar y comprender
- 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
- T4 es más potente que el preprocesador, lo que facilita el desarrollo de las plantillas
- 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:
- El código generado desde T4 es fácil de depurar y comprender
- T4 es más simple
- T4 es más poderoso
- T4 se puede ejecutar como parte del proceso de compilación o bajo demanda
- 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;
- 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.
- No es estándar
- 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.