Visual Studio .natvis файл, массив визуализации классов

У меня есть классы, которые в основном выглядят следующим образом, и я хотел бы сделать их более читабельными в Visual Debugger:

template <typename T, precision P = defaultp>
struct tvec4
{
    T x, y, z, w;
};

template <typename T, precision P = defaultp>
struct tmat4x4
{
    typedef tvec4<T, P> col_type;

private:
    col_type value[4];
};

Вот как выглядит файл natvis для вектора:

<Type Name="glm::tvec4&lt;*&gt;">
    <DisplayString>{x}, {y}, {z}, {w}</DisplayString>
    <Expand>
        <Item Name="x">x</Item>
        <Item Name="y">y</Item>
        <Item Name="z">z</Item>
        <Item Name="w">w</Item>
    </Expand>
</Type>

Которые работают нормально. Однако, для класса матрицы мне не удается заставить что-либо работать.

Try1:

<Type Name="glm::tmat4&lt;*&gt;">
    <DisplayString>{{value[0]}, {value[1]}, {value[2]}, {value[3]}}</DisplayString>
    <Expand>
        <Item Name="[0]">value[0]</Item>
        <Item Name="[1]">value[1]</Item>
        <Item Name="[2]">value[2]</Item>
        <Item Name="[3]">value[3]</Item>
    </Expand>
</Type>

Try2:

<Type Name="glm::tmat4&lt;*&gt;">
    <DisplayString>{size = {4 x 4}}</DisplayString>
    <Expand>
        <Item Name="[size]">4</Item>
        <Item Name="[capacity]">4</Item>
        <ArrayItems>
            <Size>4</Size>
            <ValuePointer>value</ValuePointer>
        </ArrayItems>
    </Expand>
</Type>

Есть идеи, что я делаю не так?

Спасибо! Christophe

2 ответа

Вы должны попробовать включить диагностику. Это объясняется здесь: https://code.msdn.microsoft.com/Writing-type-visualizers-2eae77a2

Создайте раздел реестра ниже:

[HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\11.0_Config\Debugger]
   "EnableNatvisDiagnostics"=dword:00000001

Это старый вопрос, поэтому я предполагаю, что у вас уже есть решение, но на тот случай, если у кого-то еще есть подобная проблема, это зависит от использования фигурных скобок в описании:

<DisplayString>{{value[0]}, {value[1]}, {value[2]}, {value[3]}}</DisplayString>

Одна фигурная скобка {} указывает, что содержимое должно интерпретироваться отладчиком, но если вы действительно хотите, чтобы фигурная скобка была частью описания, вам нужно использовать двойные фигурные скобки:

{{Text here {variable_name_here}}}

Так что в вашем случае это сделало бы правильную строку отображения:

<DisplayString>{{{value[0]}, {value[1]}, {value[2]}, {value[3]}}}</DisplayString>
Другие вопросы по тегам