调试模板

iav*_*avr 7 c++ debugging templates compilation template-meta-programming

任何以某种形式使用泛型编程或模板元编程的人都遇到过诸如意外的长编译时间,大型可执行文件,深度嵌套的编译器错误消息或填写整个屏幕的类型名称等问题.

最近一个不幸的例子是未使用函数"意外"实例化.仅仅为了动力,今天我还有另一个"意想不到的"系列活动:

  • 比方说T,正在测试一种类型std::is_empty;
  • 一个SFINAE实现(除非内置),派生另一种类型,比如说D,来自T;
  • 可能在生成隐式赋值运算D符时,T实例化(用户定义的)泛型赋值运算符;
  • 因为std::enable_if,这种操作实例std::is_assignable <M, T>,其中M是一个部件或碱的类型T,并且在同一类模板的一个实例T;
  • 最终,一个类型特征TR被实例化,T这需要std::is_empty <T>; 在这一点上,我得到一个错误,某些类型不完整.

我可以通过一些特殊化来轻松修补它TR,因为std::is_empty在特定情况下并不需要."轻松"意味着大约需要两个小时来分析错误消息.有趣的是,当我从其他地方(一个"遥远的"基类T)中删除一个从未使用过的无条件赋值运算符时,所有这些都被揭示出来了.该补丁也加快了编译速度,但我不会调查它是否不是为了错误.

在过去,我已经看到编译时间下降,例如从小的或更大的补丁,从2分钟下降到10秒,随机出现或者有点想象力.

问题是:是否有系统的方法或工具来控制,而等待我们的模板代码编译正在发生的事情,这将帮助我们改进,即使它使用的代码,类似于我们如何调试运行时程序?

我见过的唯一(或最好)工具是Templight,它与clang配合使用,需要编译器补丁.它的会议C++幻灯片看起来很酷,但在尝试之前,我会很感激任何相关的想法.

我发现的其他问题/资源就是例如

但是已经过时了.