En général, il n'est pas possible de sortir le code entier. Mais ce que j'ai trouvé extrêmement intéressant, c'est la possibilité d'utiliser le débogueur Visual C++ pour vous montrer le type. Prenez ce méta-programme simple:
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;
}
J'ai juste instancié mes méta-types. Ce sont toujours des instances de classe C++ vides d'une longueur d'au moins 1 octet. Maintenant, je peux mettre un point d'arrêt après la dernière instanciation de test2 et voir quels types/longueur des valeurs, test1 et test2 sont de:
Voici ce que le débogueur montre:
length 3 unsigned int
test1 {...} type_list<int,type_list<double,type_list<char,null_type> > >
test2 -52 'Ì' char
Maintenant, vous savez que le head vous renvoie un caractère, votre liste contient int, double, char et se termine par null_type.
Cela m'a beaucoup aidé. Parfois, vous devez copier le type vraiment en désordre dans un éditeur de texte et le formater sous une forme lisible, mais cela vous donne la possibilité de tracer ce qui est à l'intérieur et comment il est calculé.
Espoir qui aide,
Ovanes
Non, mais il devrait être. Quelqu'un devrait le faire en tant que projet Clang: D –
Notez qu'en raison de [SFINAE] (https://en.wikipedia.org/wiki/Substitution_failure_is_not_an_error) le code que vous obtiendriez en remplaçant simplement chaque modèle par une alternative codée en dur serait probablement illégal. Par exemple. tant qu'elle n'est jamais appelée, une méthode d'une classe modèle peut bien appeler des choses qui n'existent pas. – MvG
@JosephGarvin Il existe actuellement un ou plusieurs projets basés sur Clang. La dernière version active de [Templight, le profileur et le débogueur de modèle d'instanciation clang-based] (https://github.com/mikael-s-persson/templight), [Templar visualizer] (https://github.com/ schulmar/Templar), ainsi que [Metashell] (https://github.com/sabel83/metashell). –