我可以只为特定的模板实例化添加断点吗?

Can I add a breakpoint only for a specific template instantiation?

假设我有一个模板类:

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 实例。

编辑:

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

因为它是为了调试目的,所以明确地编写一个涵盖该实例化的专门化,将断点放在那里:

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

编辑:嵌套模板 + 专业化

既然重写你的class是行不通的,那么让我们在嵌套模板中实现要调试的函数,并对其进行特殊化:

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
        }
    }
};

您可以添加一些只有在 Tint 时才会执行的代码,并在那里设置断点。您可以为此使用 std::is_same,或者如果您没有包含所需的 header 并且不想添加它,您可以编写自己的简单函数:

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> 已经被调用后才会命中断点。

我找到了。
只需在你想要的行中放置一个断点(我将展示一个带有 std::shared_ptr<> 的示例)。
然后转到 Breakpoints window 并注意当它中断时,断点旁边有一个小 + 将打开所有不同的实例化。
粗体中的行是当前激活的断点。

现在,不幸的是,断点 window 没有向您显示实际的模板实例化。
但是,您可以使用调用堆栈来查看当前使用的是哪个实例化。 或者,您可以右键单击每个断点,然后选择“Go To Disassembly”。

这可能会给您关于实际模板实例化的提示。 然后您可以选择要保持活动状态的断点和类型。

编辑: 您还可以将 Function 列添加到 Breakpoints window 并查看实际的模板函数。