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>


结果

c&#43;&#43; - 使.natvis将SmartPointer &lt;T&gt;显示为static_cast &lt;T *&gt;(void *)-LMLPHP

问题

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




如何修改.natvis以使工具提示显示基类(void*)中的E1

最佳答案

将类型从void*强制转换为模板类型T(您可以在.natvis文件中将其作为$ T1获得)

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

关于c++ - 使.natvis将SmartPointer <T>显示为static_cast <T *>(void *),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46021430/

10-13 08:07