Немного длинный ответ, но я думаю, что некоторые могут найти его интересным
Я бы сказал, что T4 отлично подходит для генерации C ++ с
Некоторые могут возразить, что в C ++ уже есть инструменты для выполнения метапрограммирования, например:
Препроцессор
Используя препроцессор и макросы высшего порядка, вы можете достичь чего-то, что вы можете сделать с T4, но я говорю, что у T4 есть довольно убедительные преимущества:
- Сгенерированный код из T4 легко отладить и понять
- Метапрограммирование с T4 проще, чем с препроцессором. Препроцессор может достаточно просто выполнять макросы, такие как макс / мин, но когда мы говорим о шаблонах, управляемых моделями, это становится трудным
- T4 более мощный, чем препроцессор, что облегчает разработку шаблонов
- T4 может быть выполнен как часть процесса сборки или по требованию
Частичная специализация шаблона
Я люблю трюки с частичной специализацией шаблонов, но по опыту говорю, что не все любят их поддерживать.
Я всегда стремился уменьшить избыточность кода, чтобы повысить удобство обслуживания. Кроме того, я предпочитаю ошибки времени компиляции, а не ошибки времени выполнения, когда это возможно. Поэтому после прочтения Андрея Александреску Modern C ++ я подумал, что нашел ответ .
Я написал компонент, вдохновленный этой книгой, который отлично работал, затем я ушел в отпуск. Когда я вернулся, команда выбросила компонент и переписала его, используя традиционные методы. Он содержал больше кода, был глючным и не работал так же хорошо, однако они не могли понять, как добавить функциональность к Компоненту, который я написал, и решили, что они должны это сделать. Ничто не могло быть спасено. Это были тоже умные ребята.
Они ошибались? С точки зрения ремонтопригодности я бы сказал, что они сделали правильный выбор, хотя это меня огорчает.
С этой анекдотой я хочу сказать, что у T4 есть некоторые преимущества по сравнению с частичными приемами специализации шаблонов:
- Сгенерированный код из T4 легко отладить и понять
- Т4 проще
- T4 более мощный
- T4 может выполняться как часть процесса сборки или по требованию
- Если сопровождающие могут справиться с шаблоном T4, они все равно могут спасти код (начать обслуживание сгенерированного кода и выбросить шаблон). Это не было возможно в анекдоте выше.
Конечно, в C ++ MetaProgramming представляет собой комбинацию препроцессора и частичной специализации шаблонов.
Недостатки
Конечно, у T4 есть недостатки;
- Это зависит от Visual Studio (или от Mono). Однако сгенерированный код, конечно, может быть скомпилирован GCC и другими для его компиляции.
- Это нестандартно
- Проекты Visual Studio C ++, похоже, не поддерживают T4, что вынуждает меня использовать фиктивный проект .NET для генерации кода frmo.
Завершение
В целом я потерял интерес к продвинутому метапрограммированию C ++, используя причудливые трюки с PreProcessor или системой типов (хотя я использую их для более простых задач), и в эти дни опираюсь на T4.
Если кому-то интересен пример того, как это сделать на C ++, вы можете проверить InteractiveGraphics . Это библиотека для C #, VB, PowerShell и SmallBasic для создания простой графики. Там я использую T4 для генерации всех API и шаблонного кода для передачи сообщений между .NET и C ++ (я не использую C ++ / CLI, если могу этого избежать все) из модели, описывающей API. Добавление нового метода тогда так же просто, как расширение модели и восстановление всех файлов шаблонов, затем я реализую абстрактный метод в C ++ и делаю забавные вещи.