如何使用shared_ptr在类型擦除类中显示基础数据

时间:2018-12-26 19:10:49

标签: 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项即可获取数据。

在此先感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

就像为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并为此显示额外的内容。如果您希望以不同的方式显示某种类型,例如Prop::PropModel以十进制显示,那么我对int的逻辑也可以得到改进。

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

答案 1 :(得分:1)

我最终更接近Werner Henze的答案,但是说答案提供了我需要的最终信息。为了完成起见,下面是我在本课程中的最终结果,以及它在调试器中的显示方式。在这种情况下,shared_ptr指向std::vector<int>

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

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

这会导致...