Как отобразить базовые данные в классе стирания типа, используя shared_ptr
Итак, у меня есть довольно простой класс, использующий стирание типов с использованием общего указателя.
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? Неважно, должен ли сам класс быть изменен, или это просто чистый натвис - до тех пор, пока сохраняется стирание типа, и мне не нужно расширять 4 элемента, чтобы добраться до данных.
Заранее благодарю за любую помощь.
2 ответа
Это так же просто, как добавить логику для Prop::PropModel
:
<Type Name="Prop::PropModel<*>">
<DisplayString>{prop}</DisplayString>
<Expand>
<Item Name="prop">prop</Item>
</Expand>
</Type>
Я проверил с
Prop p1{};
Prop p2{ 42 };
Prop p3{ std::string{"x"} };
и дисплей
Как вы можете увидеть свой код для типа Prop
не оптимально. Это может проверить на пустое shared_ptr
и иметь дополнительный дисплей для этого. Моя логика для Prop::PropModel
также может быть улучшен, если вы хотите, чтобы какой-то тип отображался по-другому, например int
отображается десятичный.
Кстати, вы должны включить анализ кода MSVC. Ваш код вызывает некоторые предупреждения.
В конце концов я получил гораздо ближе к ответу Вернера Хенце, но этот ответ дал окончательную информацию, которая мне была нужна. Для завершения ниже приведен мой последний natvis для этого класса, а также изображение того, как оно появляется в отладчике. В этом случае shared_ptr указывает на std::vector<int>
<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>