Как отобразить базовые данные в классе стирания типа, используя shared_ptr - PullRequest
0 голосов
/ 26 декабря 2018

Хорошо, у меня есть довольно простой класс, использующий стирание типов с использованием общего указателя.

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>

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

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

Ответы [ 2 ]

0 голосов
/ 07 января 2019

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

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

0 голосов
/ 02 января 2019

Это так же просто, как добавить логику для 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"} };

, и на дисплее отображается

enter image description here

Как видите, код для типа Prop не оптимален.Он может проверять наличие пустого shared_ptr и иметь дополнительный дисплей для этого.Моя логика для Prop::PropModel также может быть улучшена, если вы хотите, чтобы какой-либо тип отображался по-разному, например, int s отображается десятичным.

Кстати, вы должны включить анализ кода MSVC.Ваш код вызывает некоторые предупреждения.

...