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<*>">
<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<*>">
<DisplayString>{prop}</DisplayString>
<Expand>
<ExpandedItem>prop</ExpandedItem>
</Expand>
</Type>