我们说我有一个模板类:
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实例。
修改
我确实知道如何以一种我可以专门化某种类型的方式进行实例化 问题是,如果没有专业化,我可以做到吗?
答案 0 :(得分:17)
我找到了。
只需在你想要的行中放一个断点(我将用 std :: shared_ptr&lt;&gt; 显示一个例子。)
然后转到断点窗口并注意到断开时,断点旁边会有一个+
,它将打开所有不同的实例。
粗体中的行是当前处于活动状态的断点。
现在,不幸的是,断点窗口没有显示实际的模板实例。
但是,您可以使用调用堆栈来查看当前使用的实例化。
或者,您可以右键单击每个断点,然后选择“转到反汇编”。
这可能会为您提供有关实际模板实例化的提示。 然后,您可以选择要保持活动的断点和类型。
修改强> 您还可以将功能列添加到“断点”窗口,并查看实际的模板功能。
答案 1 :(得分:5)
您可以添加一些仅在T
为int
时执行的代码,并在那里设置断点。您可以使用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
}
}
};