使 .natvis 将 SmartPointer<T> 显示为 static_cast<T*>(void*)
Posted
技术标签:
【中文标题】使 .natvis 将 SmartPointer<T> 显示为 static_cast<T*>(void*)【英文标题】:make .natvis show SmartPointer<T> as static_cast<T*>(void*) 【发布时间】:2017-09-03 08:02:47 【问题描述】:E2<T>
是一个智能指针。
要在鼠标悬停在E2<T>->aField
上方时启用工具提示,我可以创建.natvis
如下:-
.cpp
class Blank
public: int sss=5;
;
template<class T> class E2
public: T* operator->()
return static_cast<T*>(atDerive);
T* atDerive; //#
;
int main()
Blank k2; k2.sss=32;
E2<Blank> e2;
e2.atDerive=&k2;
e2->sss=4;
.natvis
<Type Name="E2<*>">
<SmartPointer Usage="Minimal">atDerive</SmartPointer>
</Type>
结果
问题
如果内容void*
在基类E1
中,则上述方法不起作用。
.cpp
class E1
public: void* atBase=nullptr; //#
;
template<class T> class E2 : public E1
public: T* operator->()
return static_cast<T*>(atBase);
;
int main()
Blank k; k.sss=31;
E2<Blank> e2;
e2.atBase=&k;
e2->sss=4;
.natvis(不起作用 - 不显示工具提示)
<Type Name="E2<*>">
<SmartPointer Usage="Minimal">atBase</SmartPointer>
</Type>
问题
如何修改.natvis
以启用工具提示以显示基类(E1
)中的void*
?
【问题讨论】:
【参考方案1】:添加从void*
到模板类型T
的类型转换(您可以在.natvis 文件中将其作为$T1 获取)
<Type Name="E2<*>">
<SmartPointer Usage="Minimal">($T1*)atBase</SmartPointer>
<DisplayString>($T1*)atBase</DisplayString>
</Type>
【讨论】:
不,没什么特别的:docs.microsoft.com/en-us/visualstudio/debugger/… 在第一个E2
中使用类型化指针,在第二个中使用 void*
,但编译器无法从 void*
派生嵌套(真实)类型,所以你需要做一些类型转换来告诉编译器使用什么类型。以上是关于使 .natvis 将 SmartPointer<T> 显示为 static_cast<T*>(void*)的主要内容,如果未能解决你的问题,请参考以下文章
如何将单个字符的 natvis 限制为仅 Visual Studio 中的字符
有没有一种方法可以自动将 .natvis 附加到使用 -DebugExe 启动的调试会话?