2010-03-20 6 views
6

C'è un modo per controllare passo per passo cosa sta succedendo nel modello diciamo? Voglio dire come viene istanziato passo dopo passo e così via?Debug di metaprogrammi

Nel libro ho accennato here,

ho trovato (2 minuti fa) abbastanza interessante esempio di come binario potrebbe essere implementato come un metafunction.

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; 
    }; 

e penso che potrebbe essere molto utile per essere in grado di vedere passo dopo passo quello che è stato fatto durante l'istanza di questo modello. Grazie per le vostre risposte.

+0

Non accettarlo così rapidamente, forse qualcun altro ha un consiglio migliore :) –

risposta

0

Il meglio che ho visto fino ad ora è stato il documento di ricerca su Templight, ma non sono a conoscenza di alcuna implementazione pubblicizzata.

È possibile aiutare molto anche se si utilizzano asserzioni statiche descrittive (ad esempio, tempo di compilazione) - vedere ad es. Aumenta static assert o MPLs asserts. In alcuni casi può aiutare a provocare un errore di compilazione (ad esempio utilizzando asserzioni statiche) per ottenere una traccia di istanza del modello dal compilatore.
Inoltre, non vi è nulla che vi impedisca da un output runtime di risultati di meta-funzione per il test.

+0

Sì, penso che l'uscita runtime mi soddisfi bene. Grazie –

+0

Detto questo ora ho riscontrato un problema con l'output. Ho provato qualcosa del genere: cout << N; ma sto ricevendo errori. Aiuto. –

+1

Non è possibile inserire le istruzioni di output nelle meta-funzioni, ma è possibile generare valori da istanze concrete di metainformazioni, ad es. 'std :: cout << binary<101> :: value'. –