Вопрос

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Недостатки

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

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

Подведение итогов

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top