7

是否有任何问题可能使 MS 的 T4 模板代码生成系统不适合生成 C++ 代码?

4

2 回答 2

8

有点冗长的答案,但我认为有些人可能会觉得它很有趣

我会说 T4 非常适合生成 C++

有些人可能会反驳说 C++ 已经有工具来进行元编程,比如:

预处理器

使用预处理器和高阶宏,您可以在一定程度上实现使用 T4 可以做的事情,但我说 T4 有一些非常令人信服的好处:

  1. 从 T4 生成的代码易于调试和理解
  2. 使用 T4 进行元编程比使用预处理器更简单。预处理器可以很容易地完成像 max/min 这样的宏,但是当我们谈论模型驱动的模板时,它变得很困难
  3. T4 比预处理器更强大,更容易开发模板
  4. T4 可以作为构建过程的一部分或按需执行

部分模板专业化

我确实喜欢部分模板专业化技巧,但我从经验中说并不是每个人都喜欢维护它们。

我一直努力减少代码冗余以提高可维护性。此外,如果可能,我更喜欢编译时错误而不是运行时错误。因此,在阅读了 Andrei Alexandrescu 的 Modern C++ 之后,我想我找到了答案

我写了一个受这本书启发的组件,效果很好,然后我去度假了。当我回来时,团队已经扔掉了组件并使用传统技术重写了他们自己的组件。它包含更多代码,错误更多并且性能不佳,但是他们无法弄清楚如何将功能添加到我编写的组件中,并确定他们必须这样做。没有什么可以挽救的。这些人也是聪明人。

他们这样做有错吗?就可维护性而言,我会说他们做出了正确的选择,尽管这让我感到难过。

我对这个轶事的看法是,T4 比部分模板专业化技巧有一些好处:

  1. 从 T4 生成的代码易于调试和理解
  2. T4更简单
  3. T4更强大
  4. T4 可以在构建过程的一部分或按需执行
  5. 如果维护人员无法理解 T4 模板,他们仍然可以挽救代码(开始维护生成的代码并丢弃模板)。这在上面的轶事中是不可能的。

当然,在 C++ 中,元编程是预处理器和部分模板专业化的组合。

缺点

T4当然有缺点;

  1. 它是 Visual Studio 特定的(或 Mono 特定的)。然而,生成的代码当然可以被 GCC 和其他人编译。
  2. 这是非标准的
  3. Visual Studio C++ 项目似乎不支持 T4,这迫使我使用一个虚拟的 .NET 项目来生成代码。

包起来

总而言之,我对使用 PreProcessor 或类型系统的花哨技巧(尽管我确实将它们用于更简单的任务)进行高级 MetaProgramming C++ 失去了兴趣,并且这些天依赖于 T4。

如果有人对如何在 C++ 中执行此操作的示例感兴趣,您可以查看InteractiveGraphics。它是一个用于 C#、VB、PowerShell 和 SmallBasic 的库,用于在其中执行简单的图形。我使用 T4 生成所有 API 和样板代码,用于在 .NET 和 C++ 之间传递消息(如果可以避免的话,我不使用 C++/CLI all) 来自描述 API 的模型。添加一个新方法就像扩展模型和重新生成所有模板文件一样简单,然后我在 C++ 中实现一个抽象方法并做一些有趣的事情。

于 2013-02-09T08:13:45.980 回答
5

它可以生成您想要的任何文本,包括 C++ 代码。

于 2008-11-26T18:15:27.033 回答