我有很多模板代码。由于错误的模板代码除非编译错误,否则不会抛出编译器错误,有没有什么方法可以检查编译器实际上“编译”哪些模板函数以及哪些模板函数被完全忽略?
编辑2:
如果特定的类模板或功能模板被实例化一次,对于任何参数类型,那就没问题。我想要从未以任何形式实例化的函数/类模板列表。
以下是一个具体的例子。它们是两个不同的模板函数,我想知道其中一个或两个都不会被实例化。
template <typename T_InputItr, typename T_Distance>
void advance( T_InputItr& aItr, T_Distance aN, bidirectional_iterator_tag )
template <typename T_InputItr, typename T_Distance>
void advance( T_InputItr& aItr, T_Distance aN, random_access_iterator_tag )
编辑:目前,对于类,我会在.cpp
文件中手动实例化它们,如下所示:
template TClass<int>;
对于我感兴趣的所有类型。这很好,也很好。但那就是我记得那样做的。有时候我需要编写很多小模板类/函数,我忘了手动实例化一些函数/类模板,然后在后面找出。我希望编译器告诉我。
或者,如果我可以获得实例化的函数/类模板列表(对于任何参数),那么我可以将它与我可能在代码中grep的完整列表进行比较。
另一个好处是“测试”在模板类中编译哪些方法,该模板类使用类型特征来有选择地编译出某些函数。我想确定我的逻辑,以便在继续之前选择正确的函数是正确的。
答案 0 :(得分:2)
鉴于您正在使用MSVC 2008,您可以通过生成链接器映射文件并搜索该函数的所有实例或通过DIA检查.pdb来实现此目的。您将要使用链接器标志/ OPT:NOICF禁用COMDAT折叠,以便您可以找到恰好编译到同一程序集的函数。
答案 1 :(得分:1)
有人提到“通过添加一个间接级别可以解决所有问题” - 你可以为每个函数添加静态断言并观察编译失败:
template <typename T>
struct Asserter
{
static const bool value = false;
};
template <typename T>
struct Foo
{
void foo()
{
static_assert(Asserter<T>::value, "Foo::foo() is being compiled.");
}
void bar()
{
static_assert(Asserter<T>::value, "Foo::bar() is being compiled.");
}
};
int main()
{
Foo<int> f;
//f.foo(); // static assertion!
}
如果你不希望编译在每一步中断,你可以发出Boost static warning或类似效果的东西。
答案 2 :(得分:0)
您可以在编译后通过静态分析工具运行可执行文件,前提是您已设置编译器以包含正确的符号表...这将显示所有实例化的类及其模板参数。 Here is a link到可用于静态代码分析的工具列表。