C++ 有模板调试器吗?

C++ 有模板调试器吗?,c++,template-meta-programming,C++,Template Meta Programming,模板本身可以是程序 是否有模板调试器,以便您可以单步执行模板 这基本上必须是在编译/link/codegen期间完成的,与调试生成的程序不同 即使在许多无法使用调试器的“基本”环境中,通常也可以执行“printf调试”。模板也可以吗 编辑:考虑这一点的另一种方式是类似于C预处理器的东西。生成“预处理”源代码(编译器实际编译的预处理器的输出)通常非常有用,这可以让您看到宏的效果。一个模板等价物会更好——让编译器输出非模板源代码,以响应模板化输入。我认为最接近的是C++到C转换器。(comeau编译

模板本身可以是程序

是否有模板调试器,以便您可以单步执行模板

这基本上必须是在编译/link/codegen期间完成的,与调试生成的程序不同

即使在许多无法使用调试器的“基本”环境中,通常也可以执行“printf调试”。模板也可以吗

编辑:考虑这一点的另一种方式是类似于C预处理器的东西。生成“预处理”源代码(编译器实际编译的预处理器的输出)通常非常有用,这可以让您看到宏的效果。一个模板等价物会更好——让编译器输出非模板源代码,以响应模板化输入。我认为最接近的是C++到C转换器。(comeau编译器不是这样做的吗?

您可能想看看输出模板实例化

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

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;
}
templatestruct-TD;
模板
作废模板函数(T¶m)
{
//这两种方法都会产生一个关于“未定义类型TDwith T=…”的错误
TDtest1;
TDtest2;
}

这是在环尾狐猴滑动之后的解释。

< P>在过去的C++会议上,有一个话题。您可以在此处找到一些信息:

我不知道这些东西现在有多实用,但这是一个非常有趣的起点

我个人编写了一些助手类,这些类可以打印给定的类型,比如标准代码的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;
        }
};
模板
int DebugPrintArgs(T arg)
{

std::可能有一些工具,但我没有尝试过,所以我真的不知道它们做什么或做得如何。你可以研究或者我不能回答“逐步完成”模板编译的问题,但至于“printf风格的调试”,您可以使用预处理器指令将自定义注释或警告打印到生成输出中。不真正相关:在推导出类型后,您可以使用
typeid
获取其(损坏的)No.Black可能不是一个好主意,比如Black:是的,我已经这么做了。不同的编译器有不同的方法来提供去名字。(一般抱怨C++标准:标准不考虑调试能力足够的地方,例如,有一个标准的定义方法来获取这个冒名顶替的名字。。这和其他技术要求您编辑源代码,猜测编译时发生的情况,以便正确选择在何处插入错误或typeid()内容。