2014-10-14 5 views
11

Vorlagen können Programme in sich selbst sein.Gibt es einen Vorlagen-Debugger?

Gibt es einen Vorlagen-Debugger, so dass Sie durch die "Ausführung" der Vorlage gehen können?

Dies müsste im Grunde etwas sein, das während compile/link/codegen - und unterscheidet sich von Debuggen des generierten Programms.

Selbst in vielen "primitiven" Umgebungen, in denen Sie keinen Debugger verwenden können, können Sie normalerweise "printf debugging" ausführen. Ist das mit Vorlagen überhaupt möglich?

bearbeiten: Eine andere Möglichkeit, darüber nachzudenken, ist so etwas wie der C-Präprozessor. Es ist oft sehr nützlich, "vorverarbeiteten" Quellcode zu erzeugen - die Ausgabe aus dem Präprozessor, die der Compiler tatsächlich kompiliert - damit können Sie sehen, welchen Effekt Ihre Makros haben. Ein Template-Äquivalent wäre großartig - Lassen Sie den Compiler den Nicht-Template-Quellcode ausgeben, der dem Template-Input entspricht. Der nächste, den Sie bekommen können, nehme ich an, ist ein C++ zu C Übersetzer. (Trifft der Comeau-Compiler das nicht?)

+0

Es gibt einige Werkzeuge, aber ich habe nicht versucht, also weiß ich nicht wirklich, was sie tun oder wie gut sie es tun. Sie können in [TempLight] (https://github.com/sabel83/templight) oder [metashell] (https://github.com/sabel83/metashell) schauen –

+0

Ich kann die Frage des "durchschreiten" nicht beantworten Vorlagenkompilierung, aber soweit "printf-style debugging", können Sie Präprozessordirektiven verwenden, um benutzerdefinierte Kommentare oder Warnungen für die Build-Ausgabe zu drucken. http://stackoverflow.com/questions/3826832/is-there-a-portable-way-to-print-a-message-from-the-c-preprocessor – iwolf

+0

Nicht wirklich verwandt: * After * der Typ wurde abgeleitet , können Sie 'typeid' verwenden, um den Namen zu erhalten. – edmz

Antwort

4

Sie können sich this patch for clang anschauen, die Template-Instanziierungen ausgibt.

Ein anderes einfaches Tool sind die Fehlermeldungen, die Ihr Compiler erzeugt, um zu versuchen, eine undefinierte Vorlage zu instanziieren.

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

Dies wird in Scott Meyers CPPCon talk, direkt nach dem Katta slide erläutert.

2

Auf der letzten C++ - Konferenz gab es einen Vortrag zu diesem Thema. Einige der Informationen finden Sie hier:

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

und

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

Ich habe keine Ahnung, wie funktional das Zeug jetzt, aber es war ein sehr interessanter Startpunkt.

Ich persönlich schrieb mir einige Hilfsklassen, die mir die angegebenen Typen wie printf Debugging für Standardcode drucken können. Wenn die Kompilierung fehlschlägt, gibt es oft eine gute Fehlermeldung beim Aufruf des DebugPrinter und wenn das Programm kompiliert, aber das Ergebnis ist wirklich dumm, weil die Typ-Erweiterung nicht das ist, was ich erwarte der DebugPrinter hilft mir sehr!

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