Im Allgemeinen ist es nicht möglich, den gesamten Code auszugeben. Aber was ich sehr interessant fand, ist die Möglichkeit, den Visual C++ Debugger zu verwenden, um den Typ anzuzeigen. Nehmen Sie dieses einfache Meta-Programm:
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;
}
Ich habe gerade meine Meta-Typen instanziiert. Diese sind immer noch leere C++-Klasseninstanzen, die mindestens 1 Byte lang sind. Jetzt kann ich einen Haltepunkt nach der letzten Instanzierung von test2 setzen und sehen, welche Typen/Werte Länge, test1 und test2 haben:
Das zeigt der Debugger:
length 3 unsigned int
test1 {...} type_list<int,type_list<double,type_list<char,null_type> > >
test2 -52 'Ì' char
Jetzt wissen Sie, dass der Kopf Ihnen ein Zeichen zurückgegeben hat, Ihre Liste enthält int, double, char und wird durch null_type abgeschlossen.
Das hat mir sehr geholfen. Manchmal muss man die wirklich chaotische Schrift in einen Texteditor kopieren und in eine lesbare Form bringen, aber das gibt einem die Möglichkeit nachzuvollziehen, was drin ist und wie es berechnet wird.
Ich hoffe, das hilft,
Ovanes
2 Stimmen
Nein, aber es sollte so sein. Jemand sollte dies als ein Clang-Projekt machen :D
0 Stimmen
Beachten Sie, dass aufgrund von SFINAE der Code, den Sie erhalten würden, wenn Sie einfach jede Vorlage durch eine fest kodierte Alternative ersetzen, wäre wahrscheinlich illegal. Solange sie nicht aufgerufen wird, kann eine Methode einer Template-Klasse z. B. durchaus Dinge aufrufen, die nicht existieren.
1 Stimmen
@JosephGarvin Es gibt jetzt ein Clang-basiertes Projekt (s) für diese. Die letzte aktive Version des Templight, der Clang-basierte Template-Instanziierungs-Profiler und -Debugger , Templer-Visualisierer sowie Metashell .