2

假设我有一些带有非类型参数的模板类。

template <int hi, int wid>
class SomeThing {
...
}

我需要创建一个工具来使用给定的值来减少这个来源hiwid例如hi=2; wid=3。依次,可能有一些代码变成了死代码,工具也需要将它们截断掉。所以,最后我希望看到一个简化的源代码作为工具的输出。有什么已知的方法可以做到这一点吗?一种更难的方法可能是创建我自己的 c++ 解析器……即使是简化的也听起来很糟糕。

我知道有像 gcc-xml 和 clang 这样的工具可以解析它并提供一个易于解析的中间文件。但是,看起来我无法从中重新生成 c++ 源文件。

[编辑] 一个整体是创建一个从源代码生成源代码的工具,具有变量替换和死代码截断。

4

2 回答 2

5

我不确定我是否完全理解您的问题,但模板专业化能否满足您的需求?

template<>
class SomeThing<2, 3> {
    //trimmed content
};

如果您SomeThing使用值 2 和 3 进行实例化,编译器将选择特化,并且生成的可执行文件将仅包含“截断”内容。


编辑

根据您的编辑,我怀疑您希望有一个C++ 的部分评估器,这意味着一个程序接受一个程序及其一些输入,并生成一个专门版本的程序,其中所有可以评估的内容都已被评估.

我不知道本机 C++ 的任何现有实现;但是,您可以找到许多函数式语言的部分评估器,但也适用于 Pascal 和 C。已经完成了一些工作来为 .Net 字节码 (MSIL) 创建部分评估器,可用于部分评估 C++/CLI。[切波夫斯基等人。2003 ]

C++ 模板机制可以看作是一种有限的部分求值,因为编译器会使用模板参数生成专门的(并且可能是部分求值的)代码。但是,所有这些都是由编译器在内部执行的,没有可以可视化的中间 C++ 源代码。但是,您可以查看生成的汇编代码,它可以让您很好地了解编译器在模板实例化期间执行的操作/评估/优化。

于 2012-04-27T09:00:04.613 回答
1

没有干净的方法可以做到这一点,因为模板代码通常是图灵完备的。

作为一个非常简单的例子,考虑

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. 如果您的实现不同,您可能会意外删除实际上需要的代码。

于 2012-04-27T09:45:30.487 回答