Шаблоны T4 — подходят для генерации кода C++?
-
08-07-2019 - |
Вопрос
Существуют ли какие-либо проблемы, которые могут сделать систему генерации кода шаблона T4 от MS непригодной для генерации кода C++?
Решение
Он может генерировать любой текст, который вы хотите, включая код C ++. Р>
Другие советы
Немного длинный ответ, но я думаю, что некоторым это может быть интересно.
Я бы сказал, что T4 отлично подходит для генерации C++ с помощью
Некоторые могут возразить, что в C++ уже есть инструменты для метапрограммирования, например:
Препроцессор
Используя препроцессор и макросы более высокого порядка, вы можете добиться того же, что и T4, но я говорю, что у T4 есть несколько довольно убедительных преимуществ:
- Сгенерированный код из T4 легко отлаживать и понимать.
- Метапрограммирование с помощью Т4 проще, чем с препроцессором.Препроцессор может достаточно легко выполнять макросы, такие как max/min, но когда мы говорим о шаблонах, управляемых моделью, это становится сложнее.
- T4 более мощный, чем препроцессор, что упрощает разработку шаблонов.
- T4 может выполняться как часть процесса сборки или по требованию.
Частичная специализация шаблона
Мне нравятся трюки с частичной специализацией шаблонов, но по опыту я говорю, что не всем нравится их поддерживать.
Я всегда стремился уменьшить избыточность кода, чтобы повысить удобство сопровождения.Кроме того, я предпочитаю ошибки времени компиляции ошибкам времени выполнения, когда это возможно.Итак, прочитав «Современный C++» Андрея Александреску, я подумал, что нашел отвечать.
Я написал компонент, вдохновленный этой книгой, который отлично сработал, а затем ушел в отпуск.Когда я вернулся, команда выбросила компонент и переписала свой собственный, используя традиционные методы.Он содержал больше кода, содержал больше ошибок и работал не так хорошо, однако они не могли понять, как добавить функциональность к написанному мной компоненту, и решили, что им нужно это сделать.Ничего нельзя было спасти.Это тоже были умные ребята.
Были ли они неправы, поступив так?По ремонтопригодности я бы сказал, что они сделали правильный выбор, хоть меня это и печалит.
В этом анекдоте я хочу сказать, что T4 имеет некоторые преимущества перед приемами частичной специализации шаблонов:
- Сгенерированный код из T4 легко отлаживать и понимать.
- Т4 проще
- Т4 мощнее
- T4 может быть выполнен как часть процесса сборки или по требованию.
- Если сопровождающие смогут разобраться в шаблоне T4, они все равно смогут спасти код (начать поддерживать сгенерированный код и выбросить шаблон).В приведенном выше анекдоте это было невозможно.
Конечно, в C++ метапрограммирование представляет собой комбинацию препроцессора и частичной специализации шаблонов.
Недостатки
Конечно, у Т4 есть недостатки;
- Это зависит от Visual Studio (или Mono).Однако сгенерированный код, конечно, можно компилировать с помощью GCC и других.
- Это нестандартно
- Проекты Visual Studio C++, похоже, не поддерживают T4, что заставляет меня использовать фиктивный проект .NET для генерации кода frmo.
Подведение итогов
В общем, я потерял интерес к продвинутому метапрограммированию на C++, используя причудливые трюки с препроцессором или системой типов (хотя я использую их для более простых задач), и сейчас полагаюсь на T4.
Если кого-то интересует пример того, как это сделать на C++, вы можете посмотреть ИнтерактивнаяГрафика.Это библиотека для C#, VB, PowerShell и SmallBasic, позволяющая создавать простую графику.Там я использую T4 для генерации всех API и шаблонного кода для передачи сообщений между .NET и C++ (я не использую C++/CLI, если могу избежать всего этого) из модели, описывающей API.Добавить новый метод тогда так же просто, как расширить модель и заново сгенерировать все файлы шаблонов, затем я реализую абстрактный метод на C++ и делаю самое интересное.