有模板调试器吗?

时间:2014-10-14 16:54:23

标签: c++ template-meta-programming

模板本身可以是程序。

是否有模板调试器,因此您可以逐步执行"执行"模板?

这基本上必须是在compile / link / codegen期间完成的事情 - 并且与调试生成的程序不同。

即使在许多"原始"在不能使用调试器的环境中,通常可以进行" printf debugging"。甚至可以使用模板吗?

编辑:考虑这个的另一种方式就像C预处理器。生成"预处理"通常非常有用。源代码 - 编译器实际编译的预处理器的输出 - 这可以让你看到你的宏有什么影响。等效的模板会很棒 - 让编译器输出非模板源代码,该源代码与模板化输入相对应。我认为最接近的是C ++到C的翻译器。 (没有那个comeau编译器这样做吗?)

2 个答案:

答案 0 :(得分:4)

您可能希望查看输出模板实例化的this patch for clang

另一个简单的工具是编译器为尝试实例化未定义的模板而产生的错误消息。

template< typename > struct TD;

template< typename T >
void your_template_function( T & param )
{
    // Both of these produce an error about "undefined type TD< T > with T = ..."
    TD< T > test1;
    TD< decltype( param ) > test2;
}

这在Scott Meyers CPPCon talk中解释,就在环尾狐猴滑动之后。

答案 1 :(得分:2)

在最近几年的c ++会议上,有一个关于该主题的讨论。您可以在此处找到一些信息:

http://gsd.web.elte.hu/contents/articles/gpce06.pdf

http://patakino.web.elte.hu/ECOOP_Templight_Poster.pdf

我不知道现在的功能是多么有用,但这是一个非常有趣的起点。

我亲自给我写了一些帮助类,它们能够打印出给定类型的标准代码的printf调试。如果编译失败,它通常会在调用DebugPrinter时给出一个很好的错误消息,如果程序编译但结果真的很愚蠢,因为类型扩展不是我所期望的,DebugPrinter对我有很大的帮助!

    template< typename T>
int DebugPrintArgs( T arg )
{
    std::cout << arg  << ", ";
    return 0;
}

template <typename Head, typename ... T>
class DebugPrinter: public DebugPrinter<T...>
{
    public:
        DebugPrinter()
        {
            std::cout << "--------------------------" << std::endl;
            std::cout << __PRETTY_FUNCTION__ << std::endl;
            std::cout << "--------------------------" << std::endl;
        }

        template< typename ...Y>
            DebugPrinter( Y ... rest )
            {
                std::cout << "Construction of: " << __PRETTY_FUNCTION__ << " Values: " ;
                ExpandWithConstructor{DebugPrintArgs( rest)...};
                std::cout << std::endl;
            }

};


template <typename Head>
class DebugPrinter< Head >
{
    public:
        DebugPrinter()
        {
            std::cout << "--------------------------" << std::endl;
            std::cout << __PRETTY_FUNCTION__ << std::endl;
            std::cout << "--------------------------" << std::endl;
        }
};