Заставить.natvis показывать SmartPointer<T> как static_cast<T *>(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<*>">
<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<*>">
<SmartPointer Usage="Minimal">atBase</SmartPointer>
</Type>
Вопрос
Как изменить .natvis
включить подсказку, чтобы показать void*
то есть в базовом классе (E1
)?
1 ответ
Решение
Добавьте приведение типа из void*
к типу шаблона T
(вы можете получить его как $T1 в вашем файле.natvis)
<Type Name="E2<*>">
<SmartPointer Usage="Minimal">($T1*)atBase</SmartPointer>
<DisplayString>{($T1*)atBase}</DisplayString>
</Type>