Итак, у меня есть довольно простой класс, использующий стирание типа с использованием общего указателя.
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 и, наконец, базового шаблонного свойства, которое содержит фактические данные.
Я бы хотел написать правило natvis для отображения этих базовых данных, а не всей цепочки. К сожалению, самое большое, что я сделал, - это разыменование указателя, в результате чего у меня остается только структура PropConcept, на которую он указывает.
<Type Name = "Prop">
<DisplayString>{*prop}</DisplayString>
<Expand>
<Item Name = "prop">(*prop)</Item>
</Expand>
</Type>
Итак, конечно, мой вопрос: как пройти по «дереву», чтобы добраться до члена «prop» структуры PropModel? Не имеет значения, нужно ли настраивать сам класс или это просто чистый natvis - пока сохраняется стирание типа, и мне не нужно расширять 4 элемента, чтобы добраться до данных.
Заранее благодарю за любую помощь.





Это так же просто, как добавить логику для 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 также может быть улучшена, если вы хотите, чтобы какой-то тип отображался по-другому, например, ints отображались в десятичном виде.
Кстати, вы должны включить анализ кода 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>
Спасибо! После нескольких дней без ответа я еще немного поигрался с этим и стал страшно близок к этому ответу - только пропустив расширенный тег PropModel. Кроме того, спасибо за совет - я обязательно проверю анализ кода, прежде чем этот код когда-либо покинет мой компьютер. Я согласен, я должен обработать пустой указатель, но если он вообще есть, это указывает на более серьезную проблему. Так что по крайней мере на данный момент подойдет значение по умолчанию. Я включу свой окончательный результат в качестве ответа, но отмечу ваш как правильный.