2010-03-20 12 views
6

¿Hay alguna manera de verificar paso a paso lo que está pasando en una plantilla? Me refiero a cómo se crea una instancia paso a paso, etc.Metaprogramas de depuración

En el libro he mencionado here,

He encontrado (hace 2 minutos) bastante interesante ejemplo de cómo binario podría ser implementado como un metafunción.

template <unsigned long N> 
    struct binary 
    { 
     static unsigned const value 
      = binary<N/10>::value << 1 // prepend higher bits 
      | N%10;     // to lowest bit 
    }; 

    template <>       // specialization 
    struct binary<0>      // terminates recursion 
    { 
     static unsigned const value = 0; 
    }; 

y creo que podría ser muy útil poder ver paso a paso lo que se ha hecho durante la creación de instancias de esta plantilla. Gracias por sus respuestas.

+0

No lo acepte tan rápido, tal vez alguien más tenga una mejor sugerencia :) –

Respuesta

0

Lo mejor que he visto hasta ahora fue el documento de investigación sobre Templight, pero no conozco ninguna implementación publicada.

Puede ayudarse demasiado mediante el uso de afirmaciones descriptivas estáticas (es decir, tiempo de compilación); consulte p. Ej. Impulsa static assert o MPLs asserts. En algunos casos, puede ayudar a provocar un error de compilación (por ejemplo, mediante el uso de afirmaciones estáticas) para obtener una traza de instanciación de plantilla del compilador.
Además, no hay nada que le impida obtener resultados de meta-función para la prueba en tiempo de ejecución.

+0

Sí, creo que la salida del tiempo de ejecución me servirá. Gracias –

+0

Dicho esto, ahora he encontrado un problema con la salida. Intenté algo así: cout << N; pero obtengo errores. Ayuda. –

+1

No puede simplemente generar declaraciones de salida en meta-funciones, pero puede generar valores a partir de instancias concretas de meta-funciones, p. 'std :: cout << binary<101> :: value'. –