T4模板 - 适用于生成C++代码吗?

7
有没有什么问题会使微软的T4模板代码生成系统不适合生成C++代码?
2个回答

8

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

我认为T4非常适合生成C++代码

有些人可能会反驳说C++已经有了像:

预处理器

使用预处理器和高阶宏,您可以实现与T4相似的功能,但我认为T4有一些非常有说服力的好处:

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

部分模板特化

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

我一直努力减少代码冗余,以增加可维护性。此外,我更喜欢在可能的情况下使用编译时错误而不是运行时错误。因此,在阅读Andrei Alexandrescu的现代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项目来生成代码。

总结

总的来说,我对使用预处理器或类型系统进行高级元编程C++的花俏技巧失去了兴趣(虽然我仍然会在更简单的任务中使用它们),现在我依赖T4来完成这些工作。

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


1
谢谢 - 使用T4生成C++的示例基本上回答了我的问题,是的 :)。 - mackenir
您可以通过设置SingleFileTransformation或通过命令行来构建T4模板,详情请参见:https://msdn.microsoft.com/zh-cn/library/bb126245.aspx - Tomer W

5

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


是的。我想这是一个愚蠢的问题。不过我看到你可以指定模板语言是VB还是C#。这可能与模板输出的自动编译有关? - mackenir
您的模板是使用C#或VB生成的,但我认为这与输出无关。 - Dave Hillier
@mackenir 我不认为这是个愚蠢的问题... 有一些语法适用于不同输出结构,比如 Razor 适用于 HTML。 - Tomer W

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接