8

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フィールドに配列要素を表示しようとしています (展開ボタンをクリックする必要はありません))。

助言がありますか?説明が必要ですか?ありがとう!

4

2 に答える 2