вообще невозможно вывести весь код. Но что мне показалось чрезвычайно интересным, так это возможность использовать отладчик Visual C ++, чтобы показать вам тип. Возьмите эту простую метапрограмму:
template<class Head, class Tail>
struct type_list
{
typedef Head head;
typedef Tail tail;
};
struct null_type
{};
template<class List>
struct list_head
{
typedef typename List::head head;
};
template<class List>
struct list_tail
{
typedef typename List::tail tail;
};
template<class List>
struct list_length
{
static const size_t length = 1+list_length< typename list_tail<List>::tail >::length;
};
template<>
struct list_length<null_type>
{
static const size_t length = 0;
};
int main()
{
typedef
type_list
< int
, type_list
< double
, type_list
< char
, null_type
>
>
> my_types;
my_types test1;
size_t length=list_length<my_types>::length;
list_head<list_tail<list_tail<my_types>::tail>::tail>::head test2;
}
Я только что создал свои мета-типы. Это все еще пустые экземпляры класса C ++ длиной не менее 1 байта. Теперь я могу поставить точку останова после последнего создания test2 и посмотреть, какие типы / значения длины, test1 и test2 имеют:
Вот что показывает отладчик:
length 3 unsigned int
test1 {...} type_list<int,type_list<double,type_list<char,null_type> > >
test2 -52 'Ì' char
Теперь вы знаете, что голова вернула вам символ, ваш список содержит int, double, char и заканчивается null_type.
Это мне очень помогло. Иногда вам нужно скопировать действительно грязный тип в текстовый редактор и отформатировать его в удобочитаемую форму, но это дает вам возможность проследить, что находится внутри и как оно рассчитывается.
Надеюсь, это поможет,
Ованес