我制作了一个GCC,它使每个类模板的名称都在实例化时打印出来。您可以直接调用C++前端“代码> CcPult+,而不使用 -安静//Cule>标志,以便为函数模板获得相同的值。,c++,templates,counter,instantiation,template-meta-programming,C++,Templates,Counter,Instantiation,Template Meta Programming" /> 我制作了一个GCC,它使每个类模板的名称都在实例化时打印出来。您可以直接调用C++前端“代码> CcPult+,而不使用 -安静//Cule>标志,以便为函数模板获得相同的值。,c++,templates,counter,instantiation,template-meta-programming,C++,Templates,Counter,Instantiation,Template Meta Programming" />

自动计算TMP中实例化类的数量? 给定模板元程序(TMP),DO C++编译器生成生成统计的实例化类的数量吗?或者有没有其他方法可以自动获取此号码?例如,对于双倍阶乘 #include <iostream> template<int N> struct fact { enum { value = N * fact<N-1>::value }; }; template<> struct fact<1> { enum { value = 1 }; }; int main() { const int x = fact<3>::value; std::cout << x << "\n"; return 0; } #包括 模板结构事实{enum{value=N*事实::值};}; 模板结构事实{enum{value=1};}; int main() { 常量int x=事实::值; STD::CUT< P>我制作了一个GCC,它使每个类模板的名称都在实例化时打印出来。您可以直接调用C++前端“代码> CcPult+,而不使用 -安静//Cule>标志,以便为函数模板获得相同的值。

自动计算TMP中实例化类的数量? 给定模板元程序(TMP),DO C++编译器生成生成统计的实例化类的数量吗?或者有没有其他方法可以自动获取此号码?例如,对于双倍阶乘 #include <iostream> template<int N> struct fact { enum { value = N * fact<N-1>::value }; }; template<> struct fact<1> { enum { value = 1 }; }; int main() { const int x = fact<3>::value; std::cout << x << "\n"; return 0; } #包括 模板结构事实{enum{value=N*事实::值};}; 模板结构事实{enum{value=1};}; int main() { 常量int x=事实::值; STD::CUT< P>我制作了一个GCC,它使每个类模板的名称都在实例化时打印出来。您可以直接调用C++前端“代码> CcPult+,而不使用 -安静//Cule>标志,以便为函数模板获得相同的值。,c++,templates,counter,instantiation,template-meta-programming,C++,Templates,Counter,Instantiation,Template Meta Programming,我还没来得及把它变成一个合适的GCC选项,这只是对我自己的源代码树的一个攻击。我想把它作为一个插件来实现,但它不在我的待办事项列表的顶部。当然,没有可移植的方法来实现这一点 对于大多数编译器,都有一些黑客的方法可以做到这一点。您已经找到了一种用于MSVC的方法。对于gcc,您可能可以使用gccxml。或者,对于任何开源编译器(gcc或clang),在实例化时添加代码应该非常简单,既可以保持计数,也可以记录编译完成后可以过滤的内容 对于Clang/LLVM,您只需构建一个钩住实例化的插件,这会更干

我还没来得及把它变成一个合适的GCC选项,这只是对我自己的源代码树的一个攻击。我想把它作为一个插件来实现,但它不在我的待办事项列表的顶部。

当然,没有可移植的方法来实现这一点

对于大多数编译器,都有一些黑客的方法可以做到这一点。您已经找到了一种用于MSVC的方法。对于gcc,您可能可以使用gccxml。或者,对于任何开源编译器(gcc或clang),在实例化时添加代码应该非常简单,既可以保持计数,也可以记录编译完成后可以过滤的内容

对于Clang/LLVM,您只需构建一个钩住实例化的插件,这会更干净,但实际上可能需要做更多的工作

带有调试符号、无优化和无剥离的构建可能最终会导致每个实例化的名称出现错误,您可以对此进行grep将始终内联至少一些方法,无论您是否希望。如果您愿意修改代码,您可能可以强制它生成脱机实例化,可能类似于以下内容:

template<int N> struct fact { 
  enum { value = N * fact<N-1>::value }; 
  int *dummy() { return &fact<N-1>::value; }
};
模板结构事实{
枚举{value=N*事实::值};
int*dummy(){return&fact::value;}
};

有一个由Steven Watanabe编写的工具,可以用来计算模板实例化的数量。你可以得到它。基本上,它修改了代码,这样每次实例化一个类时都会生成一个编译器警告,然后你就可以用正则表达式处理结果文本。例如,

+1。我建议它应该e破解任何开源编译器都很容易,但实际上你已经用最好的方式证明了这一点(通过编写一个实际能够做到这一点的补丁)。谢谢!还有什么比这更方便的呢(是的,范围蠕变即将出现!)是所有类模板及其实例化数量的日志,而不仅仅是所有实例化的总数或整个列表。也许我应该尝试使用一个perl脚本来后期处理完整的构建日志。只需将输出传输到
awk-F'谢谢!修改代码并不是一个真正的选项,因为99%的实例化class模板来自Boost.MPL等,我也希望有一个干净的计数。我相信MSVC可以设置为完全关闭所有的内联和优化,这意味着您将获得所有内容的离线实例化,但我不认为任何其他编译器有这样的设置。