【发布时间】:2011-11-11 15:49:09
【问题描述】:
在使用 C++ 模板进行元编程时,是否可以使用一种方法(有点像调试器)来逐步了解模板是如何被实例化和编译的?现在看来,当创建一个复杂的模板网络时,除了查看编译器错误消息以查看模板是如何实例化的(如果有任何编译器错误)之外,确实没有很好的调试方法,如果正在生成意外的东西,则尝试从错误消息中向后工作。我不确定我正在寻找的东西是否存在,因为它必须是在编译时完成的事情,但基本上它是一种方法,有点像单步执行代码并检查堆栈框架gdb 在运行时,可以停止编译器并检查环境以了解实例化模板或嵌套模板集的顺序。
例如,假设我创建了一些简单的代码,如下所示:
template<typename T, typename R = void>
struct int_return_type {};
template<typename R>
struct int_return_type<int, R>
{
typedef R type;
};
template<typename T, typename R = void>
struct float_return_type {};
template<typename R>
struct float_return_type<float, R>
{
typedef R type;
};
template<typename T>
typename int_return_type<T>::type test()
{
cout << "T type is int" << endl;
}
template<typename T>
typename float_return_type<T>::type test()
{
cout << "T type is float" << endl;
}
int main()
{
test<int>();
test<float>();
return 0;
}
我知道这是相对容易遵循的代码,但模板可能会涉及更多,尤其是在进行元编程、递归等时。我知道编译器会发出错误消息,可用于推断模板的方式被实例化,但我也想知道当实际模板代码在语法意义上是正确的,但运行时结果仍然不正确时可以做什么。例如,最好有一种方法来停止编译器并查看 test 以及 int_return_type 和 float_return_type 正在被实例化,或者哪些实例化失败了。
是目前唯一可用于调试具有这种粒度级别的模板的选项 1) 代码不正确时的编译器错误消息,以及 2) 反汇编器和调试器的组合,以查看在运行时生成了哪些实例化代码 -时间结果不正确?或者是否有其他一些实用程序可以帮助“观察”模板是如何实例化的,并查看/检查编译器生成了哪些代码来调查和调试模板错误?
【问题讨论】:
-
除了
static_assert让你想看的东西变成错误我认为没有什么可以帮助的