Visual Studio 2017 を使用して、いくつかのクラスのビジュアライザーを作成していますが、.natvis コードの読みやすさに関して問題が発生しています。カスタム配列型があり、[展開] ボタンを使用するのではなく、[ウォッチ]ウィンドウの[値]フィールドにそのメンバーを直接表示したいと考えています。
arrayTypeは、配列タイプ (Sparse、Empty、Dense、Singleton) を定義する列挙型です。 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 タグ内で使用する必要があります (繰り返しますが、 Valueフィールドに配列要素を表示しようとしています (展開ボタンをクリックする必要はありません))。
助言がありますか?説明が必要ですか?ありがとう!