首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用shared_ptr在类型擦除类中显示基础数据

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

Stack Overflow用户
提问于 2018-12-27 03:10:49
回答 2查看 181关注 0票数 3

好的,我得到了一个非常简单的类,使用了类型擦除,使用了一个共享指针。

代码语言:javascript
复制
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结构。

代码语言:javascript
复制
<Type Name="Prop">
   <DisplayString>{*prop}</DisplayString>
   <Expand>
      <Item Name="prop">(*prop)</Item>
   </Expand>
</Type>

当然,我的问题是,如何遍历“树”来访问PropModel结构的"prop“成员?如果类本身需要调整,或者它只是纯粹的natvis,这并不重要-只要类型擦除仍然存在,并且我不需要扩展4个项就可以获得数据。

提前感谢您的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-03 04:54:23

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

代码语言:javascript
复制
<Type Name="Prop::PropModel&lt;*&gt;">
  <DisplayString>{prop}</DisplayString>
  <Expand>
    <Item Name="prop">prop</Item>
  </Expand>
</Type>

我已经测试过

代码语言:javascript
复制
Prop p1{};
Prop p2{ 42 };
Prop p3{ std::string{"x"} };

并且显示的是

正如您所看到的,Prop类型的代码并不是最优的。它可以检查一个空的shared_ptr,并有一个额外的显示。如果你想让某些类型以不同的方式显示,比如int的十进制显示,我对Prop::PropModel的逻辑也可以改进。

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

票数 3
EN

Stack Overflow用户

发布于 2019-01-07 05:33:35

我最终得到了更接近Werner Henze的答案,但said answer提供了我需要的最终信息。为了完整起见,下面是我对这个类的最后一个natvis,以及它在调试器中的显示方式。在本例中,shared_ptr指向一个std::vector<int>

代码语言:javascript
复制
  <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>

这导致了这个..。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53936148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档