你想要的是一个程序转换系统(PTS) http://en.wikipedia.org/wiki/Program_transformation.
这些工具通过以下方式概括了元编程完全超越编程语言(因此,与模板[和您的抱怨]不同,PTS 不限于您可以用编程语言表达的内容)。
一般来说,PTS 通过编程语言语法和漂亮打印规则进行参数化(使其能够将感兴趣的语言 P 解析为 AST,并从 AST 解解析回源代码)、一组转换(代表您所进行的更改的本质)。想要制作,例如“优化数组访问”)和一些“元程序”M,它对如何应用转换进行排序以实现您想要的确切目的(例如,“优化these数组访问但不访问those)".
一个好的 PTS 允许您用嵌入 P 语法的模式语言编写转换。因此,转换本质上是这样表述的:“如果您匹配模式 p,则将其替换为 q”,其中 p 和 q 是代码的表面语法版本出于兴趣。对于基于 AST 的转换规则,任何一种转换都无法完成任意大量的工作(因为模式 AST 是固定直径的),因此需要不止一种转换才能获得复杂的结果。
元程序对转换进行排序;它可以以多种方式编码。 Stratego 在基本转换模式语言的“策略”DSL 扩展中对元程序进行编码,这是对点上转换成功或失败以及树导航步骤(向上、向下、重复)的反应。 TXL 的元程序的功能是通过模式匹配来实现的。 DMS 使用 PARLANSE,一种并行编程语言,它允许在真正大的源代码集上(小心地)并行应用转换。 Clang 没有完整的源模式匹配,但有一些“AST”匹配器,使语法匹配更容易一些;否则,您将转换编写为沿着树向上/向下移动的过程代码,嵌入到用 C++ 本身编码的元程序中。 Rose Compiler 的元程序很大程度上像 Clang 一样是程序性的。有 Eclipse CDT 重构工具;我不太了解它们的状态,但它们没有模式定向转换,而且我认为元程序是用 Java 编写的。还有其他 PTS;他们中的大多数并不像这些那样强大或成熟。 GCC 存在,但并未组织为 PTS。 (对这一切持保留态度;我是 DMS 背后的人,所以你可能不想相信我)。
您特别想要操作 C++。这意味着该工具必须正确处理 C++。 Stratego 和 TXL 目前不支持 C++,并且不太可能,因为需要付出努力才能生成完整的 C++ 前端。 Clang 显然有一个有用的 C++ 前端。 Rose也是如此,因为它使用了EDG前端。 DMS 拥有完整的 C++11 前端,我们在大型 GCC 和 Windows C++ 代码库上构建并验证了该前端。我不确定CDT前端的成熟度;特别是,我不明白他们使用什么作为解析器。
(2015 年 9 月编辑:DMS 现在可以处理 MS 和 GCC 方言中的完整 C++14)。
通过从语言“内部”与“外部”进行元编程,你所交换的是真正神秘的“模板元编程”的可读性,而这些“模板元编程”通常不太神秘的模式语法和元编程语言。恕我直言,您获得了表达能力,因为 PTS 旨在操作源代码,并且它们通常可以调用模板根本无法接近的底层机制(符号表、类型信息、控制/数据流)提供的分析器。
对我来说,真正的优势在于 PTS 可以跨任意代码边界应用转换;大多数C++模板只能生成代码来代替模板调用。 (特别是,在语言内部实现的所有元编程/反射方案的一个缺陷是它们的能力总是受到限制;PTS 没有这样的限制)。
在我的简介中,您可以找到 DMS 描述的链接。更重要的是,那里有一组论文(例如,“案例研究:通过自动程序转换重新设计 C++ 组件模型”),描述了应用于 C++ 程序的大规模转换(将它们从一个具有复杂 API 的 RTOS 转移到完全不同的 RTOS)。系统,以及从根本上重构 API),可以让您体验一下它的样子。 (据我所知,在各种 PTS 工具中,只有 DMS 被应用于如此雄心勃勃的 C++ 转换任务。)这些论文将表明 PTS 操作根本不像模板元编程,不依赖像 SFINAE 这样的技巧,并且恕我直言,可以做任何模板元程序都无法实现的事情。