Используя 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 (опять же, я пытаюсь отобразить элементы массива в Значение поле (без необходимости нажимать кнопку расширения)).
Какие-либо предложения? Нужны уточнения? Спасибо!
Это невозможно. То, что у вас уже есть, — единственный способ реализовать то, что вы хотите (несколько строк DisplayString с условными выражениями).
Вы также можете использовать {elems, [numElems]}, который прост, но отображает также указатель.