c++ - T4 模板——适合生成 C++ 代码吗?

标签 c++ code-generation t4 template-engine

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

最佳答案

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

我会说 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 和样板代码,用于在 .NET 和 C++ 之间传递消息(如果可以避免,我不使用 C++/CLI all) 来自描述 API 的模型。添加一个新方法就像扩展模型和重新生成所有模板文件一样简单,然后我用 C++ 实现一个抽象方法并做一些有趣的事情。

关于c++ - T4 模板——适合生成 C++ 代码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/295506/

相关文章:

c# - 在 .Net 外部组件中使用 C++ native dll 已引发异常

C++如何将代码拆分成多个文件?

c# - 动态编译以提高性能

php - 从 json 对象创建 php 类树

python - 如何为生成的 C++ 转义字符串?

c# - 如何以编程方式添加程序集引用?

c# - 如何使用 dbSchema Entity Framework 为类名添加前缀

c++ - TCP Recv 使用 select() 返回 1 字节读取

c++ - 使用 SCons 提取每个编译单元的编译时间

t4 - 从 TextTransform.exe 获取参数值到模板中