给定模板元程序(TMP),C++编译器是否会生成构建统计信息来计算实例化类的数量?或者有没有其他方法可以自动获得这个数字?因此对于例如所述obiquitous阶乘自动计算TMP中实例化类的数量?
#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;
}
我想取回号3(因为实际上< 3>,事实上< 2>,和事实上< 1>被实例化)。这个例子当然不重要,但是当你开始使用例如Boost.MPL,编译时间真的爆炸了,我想知道有多少是由于隐藏的类实例。我的问题主要是针对Visual C++,但是对于gcc的回答也是值得赞赏的。
编辑:为Visual C++从斯蒂芬T. Lavavej的videos/d1reportAllClassLayout之一加入编译开关,这样做对输出文件的grep +字数,但它(一)增加编制我目前非常脆弱的方法次数巨大和(b)正则表达式很难100%正确。
+1。我建议,应该很容易地破解任何开源编译器,但是实际上以最好的方式证明了它(通过编写一个实际上可以实现的补丁)。 – abarnert 2012-07-10 01:19:05
谢谢!什么会更方便(是的,范围蔓延!)是所有类模板的日志和它们的实例化的数量,而不仅仅是所有实例的总数或整个列表。也许一个perl脚本来后处理完整的构建日志是我应该尝试的。 – TemplateRex 2012-07-10 06:11:58
只是输出到'awk -F'<''{templates [$ 1] ++} END {for(t in templates)print t,templates [t]}'' – 2012-07-10 09:11:38