заставить .natvis показывать SmartPointer & lt; T & gt; as static_cast & lt; T * & gt; (void *)

E2<T> это умный указатель

Чтобы включить всплывающую подсказку E2<T>->aField когда мышь зависает над ним, я могу создать .natvis лайк :-

.CPP

class Blank{
public: int sss=5;
};
template<class T> class E2 {
public: T* operator->(){
return static_cast<T*>(atDerive);
}
T* atDerive;          //#
};
int main(){
Blank k2; k2.sss=32;
E2<Blank> e2;
e2.atDerive=&k2;
e2->sss=4;
}

.natvis

  <Type Name="E2&lt;*&gt;">
<SmartPointer Usage="Minimal">atDerive</SmartPointer>
</Type>

Результат

введите описание изображения здесь

проблема

Вышеуказанный подход не работает, если содержание void* находится в базовом классе E1,

.CPP

class E1{
public: void* atBase=nullptr;    //#
};
template<class T> class E2 : public E1{
public: T* operator->(){
return static_cast<T*>(atBase);
}
};
int main(){
Blank k; k.sss=31;
E2<Blank> e2;
e2.atBase=&k;
e2->sss=4;
}

.natvis (не работает — подсказка не появляется)

  <Type Name="E2&lt;*&gt;">
<SmartPointer Usage="Minimal">atBase</SmartPointer>
</Type>

Вопрос

Как изменить .natvis включить подсказку, чтобы показать void* то есть в базовом классе (E1)?

0

Решение

Добавьте приведение типа из void* к типу шаблона T (вы можете получить его как $ T1 в вашем файле .natvis)

<Type Name="E2&lt;*&gt;">
<SmartPointer Usage="Minimal">($T1*)atBase</SmartPointer>
<DisplayString>{($T1*)atBase}</DisplayString>
</Type>
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]