2014-10-14 7 views
11

I modelli possono essere programmi in sé.Esiste un debugger di modelli?

Esiste un debugger modello in modo da poter passare attraverso "l'esecuzione" del modello?

Questo dovrebbe essere fondamentalmente qualcosa che viene eseguito durante la compilazione/collegamento/codegen - ed è diverso dal debug del programma generato.

Anche in molti ambienti "primitivi" in cui non è possibile utilizzare un debugger, in genere è possibile eseguire "debug di stampa". È anche possibile con i modelli?

modifica: un altro modo di pensare a questo è qualcosa come il preprocessore C. È spesso molto utile generare un codice sorgente "preelaborato" - l'output dal preprocessore che il compilatore sta effettivamente compilando - questo ti permette di vedere quale effetto hanno i tuoi macronutrienti. Un modello equivalente sarebbe fantastico - fa in modo che il compilatore emetta il codice sorgente non-template che corrisponde all'inserimento basato su modello. Il più vicino che si possa ottenere suppongo sia un traduttore C++ in C. (Il compilatore di Comeau non lo fa?)

+0

Ci sono alcuni strumenti ma non l'ho provato quindi non so davvero cosa fanno o quanto bene lo fanno. Puoi esaminare [TempLight] (https://github.com/sabel83/templight) o [metashell] (https://github.com/sabel83/metashell) –

+0

Non riesco a rispondere alla domanda "passare attraverso" compilazione di template, ma per quanto riguarda il "debugging in stile printf", è possibile utilizzare le direttive del preprocessore per stampare commenti o avvertimenti personalizzati sull'output di build. http://stackoverflow.com/questions/3826832/is-there-a-portable-way-to-print-a-message-from-the-c-preprocessore – iwolf

+0

Non proprio correlato: * Dopo * il tipo è stato dedotto , puoi usare 'typeid' per ottenere il suo nome (storpiato). – edmz

risposta

4

È possibile che si desideri esaminare this patch for clang che genera le istanze del modello.

Un altro semplice strumento è il messaggio di errore che il compilatore produce per tentare di creare un'istanza di un modello non definito.

template<typename> struct TD; 

template< typename T > 
void your_template_function(T & param) 
{ 
    // Both of these produce an error about "undefined type TD<T> with T = ..." 
    TD<T> test1; 
    TD< decltype(param) > test2; 
} 

Questo è spiegato in Scott Meyers CPPCon talk, subito dopo la diapositiva lemure dalla coda.

2

Negli ultimi anni della conferenza C++ si è parlato di questo argomento. Alcune delle informazioni si possono trovare qui:

http://gsd.web.elte.hu/contents/articles/gpce06.pdf

e

http://patakino.web.elte.hu/ECOOP_Templight_Poster.pdf

Non ho idea di come funzionale che roba è questo, ma è stato un punto di inizio molto interessante.

I personali mi hanno scritto alcune classi di supporto che sono in grado di stamparmi i tipi dati come il debug di printf per il codice standard. Se la compilazione fallisce spesso dà un buon messaggio di errore mentre si chiama DebugPrinter e se il programma si compila ma il risultato è veramente stupido perché l'espansione di tipo non è quella che mi aspetto che il DebugPrinter mi aiuti molto!

template< typename T> 
int DebugPrintArgs(T arg) 
{ 
    std::cout << arg << ", "; 
    return 0; 
} 

template <typename Head, typename ... T> 
class DebugPrinter: public DebugPrinter<T...> 
{ 
    public: 
     DebugPrinter() 
     { 
      std::cout << "--------------------------" << std::endl; 
      std::cout << __PRETTY_FUNCTION__ << std::endl; 
      std::cout << "--------------------------" << std::endl; 
     } 

     template< typename ...Y> 
      DebugPrinter(Y ... rest) 
      { 
       std::cout << "Construction of: " << __PRETTY_FUNCTION__ << " Values: " ; 
       ExpandWithConstructor{DebugPrintArgs(rest)...}; 
       std::cout << std::endl; 
      } 

}; 


template <typename Head> 
class DebugPrinter<Head> 
{ 
    public: 
     DebugPrinter() 
     { 
      std::cout << "--------------------------" << std::endl; 
      std::cout << __PRETTY_FUNCTION__ << std::endl; 
      std::cout << "--------------------------" << std::endl; 
     } 
}; 
Problemi correlati