使 .natvis 将 SmartPointer<T> 显示为 static_cast<T*>(void*)

make .natvis show SmartPointer<T> as static_cast<T*>(void*)

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&lt;*&gt;">
    <SmartPointer Usage="Minimal">atDerive</SmartPointer>
  </Type>

结果

问题

如果内容 void* 在基础 class 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&lt;*&gt;">
    <SmartPointer Usage="Minimal">atBase</SmartPointer>
  </Type>

问题

如何修改 .natvis 以启用工具提示以显示基数 class (E1) 中的 void*

添加从 void* 到模板类型 T 的类型转换(您可以在 .natvis 文件中将其作为 $T1 获取)

<Type Name="E2&lt;*&gt;">
  <SmartPointer Usage="Minimal">($T1*)atBase</SmartPointer>
  <DisplayString>{($T1*)atBase}</DisplayString>
</Type>