Шаблоны T4 - подходит для генерации кода C ++? - PullRequest
7 голосов
/ 17 ноября 2008

Есть ли какие-либо проблемы, которые могут сделать систему генерации кода T4-шаблона MS непригодной для генерации кода C ++?

Ответы [ 2 ]

7 голосов
/ 09 февраля 2013

Немного длинный ответ, но я думаю, что некоторые могут найти его интересным

Я бы сказал, что T4 отлично подходит для генерации C ++ с

Некоторые могут возразить, что в C ++ уже есть инструменты для выполнения метапрограммирования, например:

Препроцессор

Используя препроцессор и макросы высшего порядка, вы можете достичь чего-то, что вы можете сделать с T4, но я говорю, что у T4 есть довольно убедительные преимущества:

  1. Сгенерированный код из T4 легко отладить и понять
  2. Метапрограммирование с T4 проще, чем с препроцессором. Препроцессор может достаточно просто выполнять макросы, такие как макс / мин, но когда мы говорим о шаблонах, управляемых моделями, это становится трудным
  3. T4 более мощный, чем препроцессор, что облегчает разработку шаблонов
  4. T4 может быть выполнен как часть процесса сборки или по требованию

Частичная специализация шаблона

Я люблю трюки с частичной специализацией шаблонов, но по опыту говорю, что не все любят их поддерживать.

Я всегда стремился уменьшить избыточность кода, чтобы повысить удобство обслуживания. Кроме того, я предпочитаю ошибки времени компиляции, а не ошибки времени выполнения, когда это возможно. Поэтому после прочтения Андрея Александреску Modern C ++ я подумал, что нашел ответ .

Я написал компонент, вдохновленный этой книгой, который отлично работал, затем я ушел в отпуск. Когда я вернулся, команда выбросила компонент и переписала его, используя традиционные методы. Он содержал больше кода, был глючным и не работал так же хорошо, однако они не могли понять, как добавить функциональность к Компоненту, который я написал, и решили, что они должны это сделать. Ничто не могло быть спасено. Это были тоже умные ребята.

Они ошибались? С точки зрения ремонтопригодности я бы сказал, что они сделали правильный выбор, хотя это меня огорчает.

С этой анекдотой я хочу сказать, что у T4 есть некоторые преимущества по сравнению с частичными приемами специализации шаблонов:

  1. Сгенерированный код из T4 легко отладить и понять
  2. Т4 проще
  3. T4 более мощный
  4. T4 может выполняться как часть процесса сборки или по требованию
  5. Если сопровождающие могут справиться с шаблоном T4, они все равно могут спасти код (начать обслуживание сгенерированного кода и выбросить шаблон). Это не было возможно в анекдоте выше.

Конечно, в C ++ MetaProgramming представляет собой комбинацию препроцессора и частичной специализации шаблонов.

Недостатки

Конечно, у T4 есть недостатки;

  1. Это зависит от Visual Studio (или от Mono). Однако сгенерированный код, конечно, может быть скомпилирован GCC и другими для его компиляции.
  2. Это нестандартно
  3. Проекты Visual Studio C ++, похоже, не поддерживают T4, что вынуждает меня использовать фиктивный проект .NET для генерации кода frmo.

Завершение

В целом я потерял интерес к продвинутому метапрограммированию C ++, используя причудливые трюки с PreProcessor или системой типов (хотя я использую их для более простых задач), и в эти дни опираюсь на T4.

Если кому-то интересен пример того, как это сделать на C ++, вы можете проверить InteractiveGraphics . Это библиотека для C #, VB, PowerShell и SmallBasic для создания простой графики. Там я использую T4 для генерации всех API и шаблонного кода для передачи сообщений между .NET и C ++ (я не использую C ++ / CLI, если могу этого избежать все) из модели, описывающей API. Добавление нового метода тогда так же просто, как расширение модели и восстановление всех файлов шаблонов, затем я реализую абстрактный метод в C ++ и делаю забавные вещи.

5 голосов
/ 26 ноября 2008

Может генерировать любой текст, который вы хотите, включая код C ++.

...