Visual Studio Natvis DisplayString Условия

Используя Visual Studio 2017, я пишу визуализатор для некоторых классов, но у меня возникают проблемы с читаемостью кода .natvis. У меня есть собственный тип массива, и я хотел бы отображать его элементы в Часы функция окна Значение поле непосредственно (в отличие от необходимости использовать кнопку расширения).

arrayType перечисление, определяющее тип массива (Разреженный, Пустой, Плотный, Синглтон). numElems это количество записей в массиве. Нет необходимости фокусироваться на этой структуре данных; это всего лишь пример. Вот мой текущий код natvis:

<Type Name="MyProject::MyArray"<DisplayString Condition="numElems == 0">
{arrayType,  en}
</DisplayString>
<DisplayString Condition="numElems == 1">
{arrayType,  en} {*elems[0]}
</DisplayString>
<DisplayString Condition="numElems == 2">
{arrayType,  en} {*elems[0]}, {*elems[1]}
</DisplayString>
<DisplayString Condition="numElems == 3">
{arrayType,  en} {*elems[0]}, {*elems[1]}, {*elems[2]}
</DisplayString>
<DisplayString Condition="numElems >= 4">
{arrayType,  en} {*elems[0]}, {*elems[1]}, {*elems[2]}, ...
</DisplayString>
</Type>
[Обратите внимание, что я должен повторить тот же код снова (просто добавив дополнительный элемент для отображения). Я остановился на отображении 3 элементов из-за раздувания кода.]

Это позволило бы Окно просмотра (в Visual Studio) для отображения объектов следующим образом:

Name       Value
arr1       Sparse 5, 3                         ; numElems is 2
arr2       Empty                               ; numElems is 0
arr3       Singleton 1                         ; numElems is 1
arr4       Dense 58, 23, 1, ...                ; numElems is >= 4

В идеале тег DisplayString допускает наличие в нем условий. Я попробовал следующий обходной путь с троичными операторами C ++, который не работал.

<Type Name="MyProject::Array"<DisplayString>
{arrayType,  en} {(numElems >= 1) ? *elems[0] : ""}, {(numElems >= 2) ? *elems[1] : ""}, {(numElems >= 3) ? *elems[2] : ""}, {(numElems >= 4) ? "..." : ""}
</DisplayString>
</Type>

Обратите внимание, что в этом коде мне не нужно повторять тег DisplayString несколько раз и дублировать код. Может быть, есть способ предоставить итератор в DisplayString, чтобы перечислить все (переменное количество) элементов? Я знаю о теге ArrayItems, но его необходимо использовать в теге Expand (опять же, я пытаюсь отобразить элементы массива в Значение поле (без необходимости нажимать кнопку расширения)).

Какие-либо предложения? Нужны уточнения? Спасибо!

2

Решение

Это невозможно. То, что у вас уже есть, — единственный способ реализовать то, что вы хотите (несколько строк DisplayString с условными выражениями).

2

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

Вы также можете использовать {elems, [numElems]}, который прост, но отображает также указатель.

0

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