c++ - 如何使用 shared_ptr 在类型删除类中显示基础数据

标签 c++ shared-ptr natvis

好的,所以我有一个非常简单的类,它使用类型删除和共享指针。

class Prop
{
    struct PropConcept
    {
        virtual ~PropConcept() {}
    };
    template<typename T>
    struct PropModel : PropConcept
    {
        PropModel(const T& t) : prop(t) { }
        PropModel() {}
        virtual ~PropModel() {}
    private:
        T prop;
    };

    std::shared_ptr<PropConcept> prop;
public:

    template<typename T>
    Prop(const T& obj) : prop(new PropModel<T>(obj)) { }
    Prop() {};
};

这里没有问题,但是由于它的工作方式,调试器显示了从 Prop 到 std::shared_ptr(PropContent),再到 PropModel,最后是包含实际数据的底层模板化 prop 的完整链。

我想做的是编写一个 natvis 规则来显示底层数据,而不是整个链。不幸的是,我得到的最深入的是取消引用指针,这只给我留下了它指向的 PropConcept 结构。

<Type Name="Prop">
   <DisplayString>{*prop}</DisplayString>
   <Expand>
      <Item Name="prop">(*prop)</Item>
   </Expand>
</Type>

当然,我的问题是,如何遍历“树”以到达 PropModel 结构的“prop”成员?类本身是否需要调整,或者它是否只是纯粹的 natvis 都没有关系——只要类型删除仍然存在,而且我不必扩展 4 个项目来获取数据。

在此先感谢您的帮助。

最佳答案

就像为 Prop::PropModel 添加逻辑一样简单:

<Type Name="Prop::PropModel&lt;*&gt;">
  <DisplayString>{prop}</DisplayString>
  <Expand>
    <Item Name="prop">prop</Item>
  </Expand>
</Type>

我测试过

Prop p1{};
Prop p2{ 42 };
Prop p3{ std::string{"x"} };

显示是

enter image description here

如您所见,Prop 类型的代码并不是最佳的。它可以检查一个空的 shared_ptr 并且有一个额外的显示。如果您希望某些类型以不同方式显示,例如 int 显示为十进制,我的 Prop::PropModel 逻辑也可以得到改进。

顺便说一下,您应该启用 MSVC 代码分析。您的代码触发了一些警告。

关于c++ - 如何使用 shared_ptr 在类型删除类中显示基础数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53936148/

相关文章:

debugging - 是否有任何用于在 Visual Studio 2013 中调试 Qt 4.8 项目的非官方可视化工具?

c++ - Natvis TreeItems 定义不适用于 map<int,int>

android - 使用Qt和Java在sqlite中保存和检索图片

c++ - 如何将值从 python 传递给 C++ 并返回?

c++ - 如何在移动到shared_ptr后调用std::function

c++ - 将 STL 算法与 shared_ptr、函数对象一起使用

c++ - 我应该通过 API 还是通过项目的源代码本身使用英特尔 Embree?

c++ - 为旋转对象绘制边界框

c++ - 从 vector 中删除 shared_ptr 之前是否需要重置它?

c++ - Visual Studio .natvis 文件 - 矩阵