我是否可以仅为特定模板实例添加断点?

时间:2015-01-01 09:43:35

标签: c++ visual-studio debugging templates breakpoints

我们说我有一个模板类:

template <typename T>
class A
{
public:
   void foo() 
   {
      int i = 0; //breakpoint here only for type A<int>
   }
}

我可以以某种方式在Visual Studio中添加一个断点,它只会在foo内部进行某个实例化吗?

仅适用于A<int>::foo

假设我有100个不同类型的模板化A实例。

修改

我确实知道如何以一种我可以专门化某种类型的方式进行实例化 问题是,如果没有专业化,我可以做到吗?

3 个答案:

答案 0 :(得分:17)

我找到了。
只需在你想要的行中放一个断点(我将用 std :: shared_ptr&lt;&gt; 显示一个例子。)
然后转到断点窗口并注意到断开时,断点旁边会有一个+,它将打开所有不同的实例。
粗体中的行是当前处于活动状态的断点。

Breakpoint on a templated function

现在,不幸的是,断点窗口没有显示实际的模板实例。
但是,您可以使用调用堆栈来查看当前使用的实例化。 或者,您可以右键单击每个断点,然后选择“转到反汇编”。

这可能会为您提供有关实际模板实例化的提示。 然后,您可以选择要保持活动的断点和类型。

Disassembly

修改 您还可以将功能列添加到“断点”窗口,并查看实际的模板功能。

enter image description here

答案 1 :(得分:5)

您可以添加一些仅在Tint时执行的代码,并在那里设置断点。您可以使用std::is_same,或者如果您没有包含所需的标题,并且不希望添加该标题,则可以编写自己的小功能:

template <typename T>
bool isint() { return false; }

template <>
bool isint<int>() { return true; }

template <typename T>
void f() {
    if (isint<T>())
        isint<T>();
    //  ^^^^^^^^^^^ set a breakpoint on that line

    // rest of your function
}

int main()
{
    f<char>();
    f<short>();
    f<int>();
    f<long>();
}

测试显示只有在f<char>f<short>被调用后才会触发断点。

答案 2 :(得分:4)

由于它是出于调试目的,请明确编写一个覆盖该实例化的专门化,将断点放在那里:

template <>
class A<int>
{
public:
   void foo() 
   {
      int i = 0; //breakpoint here 
   }
};

编辑:嵌套模板+专业化

由于重写您的类是不可行的,让我们在嵌套模板中实现要调试的函数,并将其专门化:

template<typename T>
class A
{
public:
    void foo()
    {
        foo_impl<T,void>::exec();
    }

private:
    template<typename T, typename DUMMY>
    struct foo_impl
    {
        static void exec()
        {
            //Default impl
        }
    };

    template<typename DUMMY>
    struct foo_impl<int,DUMMY>
    {
        static void exec()
        {
            int i = 0; //Breakpoint here
        }
    }
};