En general, no es posible generar el código completo. Pero lo que encontré extremadamente interesante, es la capacidad de usar el depurador de Visual C++ para mostrarle el tipo. Tome ese metaprograma 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;
}
Acabo de instanciar mis meta-tipos. Estas todavía son instancias de clase C++ vacías que tienen al menos 1 byte de longitud. Ahora puedo poner un punto de interrupción después de la última creación de instancias de test2 y ver, qué tipos/valores de longitud, test1 y test2 son de:
Esto es lo que muestra el depurador:
length 3 unsigned int
test1 {...} type_list<int,type_list<double,type_list<char,null_type> > >
test2 -52 'Ì' char
Ahora que se conoce el head le devolvió un carácter, su lista contiene int, double, char y termina con null_type.
Eso me ayudó mucho. A veces es necesario copiar el tipo realmente desordenado a un editor de texto y formatearlo en un formato legible, pero eso le da la posibilidad de rastrear lo que está dentro y cómo se calcula.
Espero que ayude,
Ovanes
No, pero debería ser. Alguien debería hacer esto como un proyecto de Clang: D –
Tenga en cuenta que debido a [SFINAE] (https://en.wikipedia.org/wiki/Substitution_failure_is_not_an_error) el código que obtendría simplemente reemplazando cada plantilla con alguna alternativa codificada probablemente sea ilegal P.ej. siempre que nunca se llame, un método de una clase de plantilla bien puede llamar a cosas que no existen. – MvG
@JosephGarvin Ahora hay un proyecto basado en Clang para esto. La última versión activa de [Templight, el generador de perfiles y creación de instancias de plantilla basado en clang] (https://github.com/mikael-s-persson/templight), [visualizador Templar] (https://github.com/ schulmar/Templar), así como también [Metashell] (https://github.com/sabel83/metashell). –