2016-04-20 3 views
1

Я реализовал кортеж отсюда: https://voidnish.wordpress.com/2013/07/13/tuple-implementation-via-variadic-templates/Возможно ли NATVIS рекурсивный кортеж (вариационный шаблон)?

Можно ли визуализировать его с помощью NATVIS? Я дошел до

<Type Name="tuple"> 
    <DisplayString>()</DisplayString> 
</Type> 

<Type Name="tuple&lt;*&gt;"> 
    <DisplayString>({_Myfirst})</DisplayString> 
</Type> 

Как я могу получить значение _Myfirst для более чем одного типа, чтобы получить

<Type Name="tuple&lt;*,*&gt;"> 
    <DisplayString>({_Myfirst}, {???})</DisplayString> 
</Type> 

<Type Name="tuple&lt;*,*,*&gt;"> 
    <DisplayString>({_Myfirst}, {???}, {???})</DisplayString> 
</Type> 

и т.д.?

ответ

4

Вам нужно немного изменить тип, чтобы заставить это работать. Требуется base_type typedef.

т.е.

// tuple 
template<class... _Types> class tuple; 

// empty tuple 
template<> class tuple<> {}; 

// recursive tuple definition 
template<class _This, 
class... _Rest> 
class tuple<_This, _Rest...> 
    : private tuple<_Rest...> 
{ 
public: 
    typedef tuple<_Rest...> base_type; // ***** Added this line 

    _This _Myfirst; 
}; 

Теперь мы можем рекурсивно оценить базовые типы с декларациями natvis:

<!-- Handle empty tuples --> 
<Type Name="tuple&lt;&gt;"> 
    <DisplayString>()</DisplayString> 
    <Expand/> 
</Type> 

<!-- Handle a single parameter (this is also our terminator for recursion) --> 
<Type Name="tuple&lt;*&gt;"> 
    <DisplayString IncludeView="noparens">{_Myfirst}</DisplayString> 
    <DisplayString ExcludeView="noparens">({_Myfirst})</DisplayString> 
    <Expand> 
     <Item Name="Value">_Myfirst</Item> 
    </Expand> 
</Type> 

<!-- Handle 2 or more items --> 
<Type Name="tuple&lt;*,*&gt;"> 
    <!-- show the first item and then recurse by casting this to 'base_type' --> 
    <DisplayString IncludeView="noparens">{_Myfirst}, {*(base_type *)this,view(noparens)}</DisplayString> 
    <!-- Wrap our display string that doesn't a have any parentheses, this will be only done for the top level tuple --> 
    <DisplayString ExcludeView="noparens">({*this,view(noparens)})</DisplayString> 
    <Expand> 
     <!-- Show the top level item --> 
     <Item Name="Value">_Myfirst</Item> 
     <!-- Recursively expand our base types --> 
     <ExpandedItem>*(base_type *)this</ExpandedItem> 
    </Expand> 
</Type> 

И это результат:

tuple .natvis result