【问题标题】:make .natvis show SmartPointer<T> as static_cast<T*>(void*)使 .natvis 将 SmartPointer<T> 显示为 static_cast<T*>(void*)
【发布时间】:2017-09-03 08:02:47
【问题描述】:

E2&lt;T&gt; 是一个智能指针。

要在鼠标悬停在E2&lt;T&gt;-&gt;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*在基类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 以启用工具提示以显示基类(E1)中的void*

【问题讨论】:

    标签: c++ visual-studio visual-studio-2015 natvis


    【解决方案1】:

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

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

    【讨论】:

    • 不,没什么特别的:docs.microsoft.com/en-us/visualstudio/debugger/… 在第一个 E2 中使用类型化指针,在第二个中使用 void*,但编译器无法从 void* 派生嵌套(真实)类型,所以你需要做一些类型转换来告诉编译器使用什么类型。
    猜你喜欢
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 1970-01-01
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多