Как отобразить базовые данные в классе стирания типа с помощью 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 и, наконец, базового шаблонного свойства, которое содержит фактические данные.

Я бы хотел написать правило natvis для отображения этих базовых данных, а не всей цепочки. К сожалению, самое большое, что я сделал, - это разыменование указателя, в результате чего у меня остается только структура PropConcept, на которую он указывает.

<Type Name = "Prop">
   <DisplayString>{*prop}</DisplayString>
   <Expand>
      <Item Name = "prop">(*prop)</Item>
   </Expand>
</Type>

Итак, конечно, мой вопрос: как пройти по «дереву», чтобы добраться до члена «prop» структуры PropModel? Не имеет значения, нужно ли настраивать сам класс или это просто чистый natvis - пока сохраняется стирание типа, и мне не нужно расширять 4 элемента, чтобы добраться до данных.

Заранее благодарю за любую помощь.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
184
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это так же просто, как добавить логику для Prop::PropModel:

<Type Name = "Prop::PropModel&lt;*&gt;">
  <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. Ваш код вызывает некоторые предупреждения.

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

Digital_Utopia 06.01.2019 22:22

В конце концов я стал намного ближе к ответу Вернера Хенце, но этот ответ предоставил последнюю необходимую мне информацию. Для завершения, ниже мой последний natvis для этого класса, а также изображение того, как он отображается в отладчике. В этом случае shared_ptr указывает на std::vector<int>.

  <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>

Что приводит к этому ...

Другие вопросы по теме