Visual Studio Natvis DisplayString条件

joe*_*nau 5 c++ visual-studio visual-studio-debugging xml-visualizer natvis

使用Visual Studio 2017,我为某些类编写了Visualizer,但是我遇到了有关.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>
Run Code Online (Sandbox Code Playgroud)

[注意,我必须再次重复相同的代码(只是添加一个额外的元素来显示)。由于代码膨胀,我停止显示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
Run Code Online (Sandbox Code Playgroud)

理想情况下,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>
Run Code Online (Sandbox Code Playgroud)

注意,在此代码中,我不必重复多次DisplayString标签并重复代码。也许有一种方法可以在DisplayString中提供迭代器,以便列出所有(可变数量的)元素?我知道ArrayItems标记,但是必须在Expand标记内使用它(同样,我试图在Value字段中显示数组元素(无需单击展开按钮))。

有什么建议么?需要澄清吗?谢谢!