假设我有一些带有Nontype参数的模板类。
template <int hi, int wid>
class SomeThing {
...
}
我需要使用hi
和wid
的给定值(例如hi=2; wid=3
)创建一个工具来减少此来源。顺序地,可能有一些代码变成死代码,并且该工具还需要将它们截断。所以,最后我希望看到减少源代码作为工具的输出。有没有任何已知的方法来做到这一点?更难的方法是创建我自己的c ++解析器......听起来很糟糕,即使是简单的解析器。
我知道有像gcc-xml和clang这样的工具可以解析它并提供一个易于解析的中间文件。但是,看起来我不能从中重新生成c ++源文件。
[编辑] 整个图片是创建一个从源代码生成源代码的工具,具有变量替换和死代码截断。
答案 0 :(得分:5)
我不确定我是否完全理解你的问题,但模板专业化会满足你的需求吗?
template<>
class SomeThing<2, 3> {
//trimmed content
};
如果使用值2和3实例化SomeThing
,编译器将选择特化,并且生成的可执行文件将仅包含“截断”内容。
修改强>:
根据你的编辑,我怀疑你想要一个partial evaluator用于C ++,这意味着一个程序接受一个程序及其一些输入,并生成一个程序的专用版本,其中所有这些可以评估已被评估。
我不知道本机C ++的任何现有实现;但是,您可以找到许多函数式语言的部分求值程序,也可以找到Pascal和C的部分求值程序。已经完成了一些工作来创建.Net字节码(MSIL)的部分求值程序,它可以用来部分评估C ++ / CLI。 [Chepovsky et al. 2003]
C ++模板机制可以看作是一种有限的部分评估,因为编译器使用模板参数生成专门(并且可能部分评估)的代码。但是,所有这些都是由内部编译器执行的,没有可以可视化的中间C ++源代码。但是,您可以查看生成的汇编代码,它可以让您很好地了解编译器在模板实例化期间执行的操作/评估/优化。
答案 1 :(得分:1)
没有干净的方法可以做到这一点,因为模板代码通常是Turing-complete。
作为一个非常简单的例子,请考虑
template<int I>
class X : public X<I/2>
{
};
现在说要为I==351
减少此项。究竟应该是什么基类?对于真实世界的代码,您将需要一个完整的C ++编译器。更糟糕的是,您还需要一个匹配的标准库实现,并且完全代表所有兼容的标准库实现(!!)
请考虑以下代码:
template <int I>
class X : public std::vector<X<I/2> >
{
// Methods
};
消除死代码取决于std::vector
的实现。如果您的实现不同,您可以意外地删除实际需要的代码。