Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用shared_ptr在类型擦除类中显示基础数据_C++_Shared Ptr_Natvis - Fatal编程技术网

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

C++ 如何使用shared_ptr在类型擦除类中显示基础数据,c++,shared-ptr,natvis,C++,Shared Ptr,Natvis,好的,我有一个非常简单的类,使用类型擦除,使用共享指针 class Prop { struct PropConcept { virtual ~PropConcept() {} }; template<typename T> struct PropModel : PropConcept { PropModel(const T& t) : prop(t) { } PropModel()

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

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() {};
};
类道具
{
结构本体概念
{
虚拟~PropConcept(){}
};
模板
结构PropModel:PropConcept
{
PropModel(const T&T):prop(T){}
PropModel(){}
虚拟~PropModel(){}
私人:
T支柱;
};
std::共享的ptr道具;
公众:
模板
Prop(const T&obj):Prop(新PropModel(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>

{*prop}
(*道具)
当然,我的问题是,如何遍历“树”以到达PropModel结构的“prop”成员?不管类本身是否需要调整,或者它是否只是纯natvis,只要类型擦除仍然存在,并且我不必展开4个项来获取数据


提前感谢您的帮助

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

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

正如您所看到的,类型
Prop
的代码不是最佳的。它可以检查一个空的
共享\u ptr
,并有一个额外的显示。如果您希望以不同的方式显示某些类型,例如,
int
s显示为十进制,则还可以改进我的
Prop::PropModel
逻辑


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

我最终离沃纳·亨兹的答案更近了,但他说答案提供了我需要的最终信息。为了完整起见,下面是我这个类的最后一个natvis,以及它在调试器中如何显示的图片。在这种情况下,共享ptr指向
std::vector


{*prop}
(*道具)
{prop}
道具
这导致了。。。

谢谢!在几天没有回答之后,我又玩了一点,并且非常接近这个答案——只是忽略了PropModel扩展标签。另外,谢谢你的建议——在代码离开我的电脑之前,我一定要检查代码分析。我同意,我应该处理一个空指针,但如果它真的是空指针,那就意味着一个更大的问题。因此,至少目前,默认设置可以。我会把我的最终结果作为答案,但要把你的答案记为正确。
Prop p1{};
Prop p2{ 42 };
Prop p3{ std::string{"x"} };
  <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>