c++ - Visual Studio Natvis DisplayString 条件

标签 c++ visual-studio visual-studio-debugging natvis xml-visualizer

我正在使用 Visual Studio 2017 为某些类编写可视化工具,但遇到了 .natvis 代码可读性方面的问题。我有一个自定义数组类型,我想在 Watch 窗口的 Value 字段中直接显示它的成员(而不是必须使用展开按钮)。

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 个元素。]

这将允许监 window 口(在 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 字段中显示数组元素(无需单击展开按钮))。

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

最佳答案

这是不可能的。你已经拥有的是实现你想要的东西的唯一方法(多个带有条件的 DisplayStrings)。

关于c++ - Visual Studio Natvis DisplayString 条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47128605/

相关文章:

c++ - 灰度中的 glDrawPixels?

c++ - 尝试用 C++/Qt 制作插件系统

visual-studio - 如何在Visual Studio测试运行器中排除某些测试?

c++ - Visual Studio 2015 年。如何*不*介入某些功能?

c++ - 如何在 BlackBerry 10 Simulator 上模拟捏合?

c++ - 如何在现代 C++ 中有效地为指向虚拟基类的指针 vector 分配空间

c# - 针对不同接口(interface)实现的 Visual Studio 单元测试

visual-studio - 在Visual Studio监 window 口中展平继承的成员?

visual-studio-2010 - 使用 Visual Studio 的调试器查看动态分配的空终止字符串

c - 首次使用类型时,Visual Studio 是否可能中断?