是否有任何问题可能使MS的T4模板代码生成系统不适合生成C++代码?
有点冗长的答案,但我认为有些人可能觉得有趣
我会说T4非常适合生成C++
有些人可能反驳说C++已经有了使用以下方法进行MetaProgramming的工具:
预处理器
使用预处理器和高阶宏可以实现T4的功能,但我说T4有一些非常令人信服的好处:
T4生成的代码易于调试和理解
使用T4进行MetaProgramming比使用预处理器更简单.预处理器可以很容易地执行像max/min这样的宏,但是当我们谈论模型驱动的模板时,它变得很困难
T4比预处理器更强大,可以更容易地开发模板
T4可以作为构建过程的一部分或按需执行
部分模板专业化
我确实喜欢部分模板专业化技巧,但我从经验中说出并非每个人都喜欢维护它们.
我一直努力减少代码冗余,以提高可维护性.另外,在可能的情况下,我更喜欢编译时错误而不是运行时错误.因此,在阅读了Andrei Alexandrescu的Modern C++后,我想我找到了答案.
我写了一本灵感来自这本书的组件,效果很好,然后我去度假了.当我回来时,团队抛出了组件并使用传统技术重写了自己的组件.它包含更多的代码,更加笨拙并且表现不佳,但他们无法想象如何将功能添加到我编写的组件中并确定他们必须这样做.没有什么可以挽救.这些人也很聪明.
他们这样做错了吗?在可维护性方面,我会说他们做了正确的选择,尽管让我很难过.
我对这个方法的看法是,T4比部分模板专业化技巧有一些好处:
T4生成的代码易于调试和理解
T4更简单
T4更强大
T4可以执行构建过程的一部分或按需执行
如果维护人员可以绕过T4模板,他们仍然可以抢救代码(开始维护生成的代码并丢弃模板).在上面的方法中,这是不可能的.
当然,在C++中,MetaProgramming是PreProcessor和部分模板特化的组合.
缺点
T4当然有缺点;
它是Visual Studio特定的(或Mono特定的).但是,生成的代码当然可以由GCC和其他人编译.
这是非标准的
Visual Studio C++ Projects似乎不支持T4,这迫使我使用虚拟.NET项目生成代码frmo.
包起来
总而言之,我对使用PreProcessor或类型系统的花哨技巧进行高级MetaProgramming C++失去了兴趣(虽然我确实将它们用于更简单的任务)并且依赖于T4.
如果有人对如何在C++中使用它的示例感兴趣,您可以查看InteractiveGraphics.这是一个用于C#,VB,PowerShell和SmallBasic的库,用于执行简单的图形.我使用T4生成所有API和样板代码,用于在.NET和C++之间传递消息(如果我能避免它,我不使用C++/CLI所有)来自描述API的模型.添加一个新方法就像扩展模型和重新生成所有temlate文件一样简单,然后我在C++中实现一个抽象方法并做有趣的事情.
它可以生成您想要的任何文本,包括C++代码.