我可以只为特定的模板实例化添加断点吗?
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
}
}
};
您可以添加一些只有在 T
是 int
时才会执行的代码,并在那里设置断点。您可以为此使用 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 并查看实际的模板函数。
假设我有一个模板类:
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
}
}
};
您可以添加一些只有在 T
是 int
时才会执行的代码,并在那里设置断点。您可以为此使用 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 并查看实际的模板函数。