Im Allgemeinen ist es nicht möglich, den gesamten Code auszugeben. Aber was ich sehr interessant fand, ist die Fähigkeit, Visual C++ - Debugger zu verwenden, um Ihnen den Typ zu zeigen. Nimm das einfache Metaprogramm:
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. Dies sind immer noch leere C++ - Klasseninstanzen, die mindestens 1 Byte lang sind. Jetzt kann ich einen Haltepunkt nach der letzten Instanziierung test2 setzen und sehen, welche Typen/Werte Länge, test1 und test2 ist:
Hier ist, was der Debugger zeigt:
length 3 unsigned int
test1 {...} type_list<int,type_list<double,type_list<char,null_type> > >
test2 -52 'Ì' char
Jetzt Sie wissen, die head hat dir ein Zeichen zurückgegeben, deine Liste enthält int, double, char und wird mit null_type beendet.
Das hat mir sehr geholfen. Manchmal müssen Sie den wirklich unordentlichen Typ in einen Texteditor kopieren und ihn in eine lesbare Form formatieren, aber das gibt Ihnen die Möglichkeit zu verfolgen, was drin ist und wie es berechnet wird.
Hoffnung, die hilft,
Ovanes
Nein, aber es sollte. Jemand sollte dies als ein Clang-Projekt tun: D –
Beachten Sie, dass aufgrund von [SFINAE] (https://en.wikipedia.org/wiki/Substitution_failure_is_not_an_error) der Code erhalten Sie einfach durch Ersetzen jeder Vorlage mit einer fest codierten Alternative wäre wahrscheinlich illegal. Z.B. Solange es nie aufgerufen wird, kann eine Methode einer Template-Klasse Dinge aufrufen, die nicht existieren. – MvG
@JosephGarvin Es gibt jetzt ein Clang-basiertes Projekt (s). Die neueste aktive Version von [Templight, der Clomb-basierte Vorlage Instanziierung Profiler und Debugger] (https://github.com/mikael-s-Persson/Templight), [Templar Visualizer] (https://github.com/ Schulmar/Templer), sowie [Metashell] (https://github.com/sabel83/metashell). –