in generale non è possibile stampare l'intero codice. Ma quello che ho trovato estremamente interessante, è la possibilità di usare il debugger di Visual C++ per mostrarti il tipo. Prendi questo semplice meta-programma:
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;
}
Ho appena creato un'istanza dei miei meta-tipi. Queste sono istanze di classe C++ ancora vuote che hanno una lunghezza di almeno 1 byte. Ora posso mettere un punto di interruzione dopo l'ultima istanza di test2 e vedere, quali tipi/valori di lunghezza, test1 e test2 sono di:
Ecco ciò che il debugger mostra:
length 3 unsigned int
test1 {...} type_list<int,type_list<double,type_list<char,null_type> > >
test2 -52 'Ì' char
Ora si conosce il head ti ha restituito un carattere, la tua lista contiene int, double, char e termina con null_type.
Questo mi ha aiutato molto. A volte è necessario copiare il tipo veramente disordinato in un editor di testo e formattarlo in un formato leggibile, ma ciò ti dà la possibilità di rintracciare ciò che è dentro e come viene calcolato.
Speranza che aiuta,
Ovanes
No, ma dovrebbe essere. Qualcuno dovrebbe farlo come un progetto Clang: D –
Si noti che a causa di [SFINAE] (https://en.wikipedia.org/wiki/Substitution_failure_is_not_an_error) il codice che si ottiene semplicemente sostituendo ogni modello con qualche alternativa hardcoded sarebbe probabilmente illegale. Per esempio. finché non viene mai chiamato, un metodo di una classe template potrebbe chiamare cose che non esistono. – MvG
@JosephGarvin C'è un progetto Clang a base di (s) per questo ora. L'ultima versione attiva di [Templight, il template per la creazione di istanze di template clang e il debugger] (https://github.com/mikael-s-persson/templight), [Templar visualizer] (https://github.com/) schulmar/Templari), così come [Metashell] (https://github.com/sabel83/metashell). –