#ifdef DEBUG mit templates?



  • hallo, um meinen code besser
    zu struktuieren, wollte ich eine klasse schreiben, welche
    debuginfos sammelt, diese soll natürlich zu nichts zerfallen,
    wenn man debugging deaktiviert, mein ansatz war folgender :

    template <bool>
    struct FillInDecodingInfos
    {
      void addDebugInfos(double info1, double info2, DebugInfo& info);
    };
    
    template <>
    struct FillInDecodingInfos<true>
    {
      void addDebugInfos(double info1, double info2, DebugInfo& info) 
      {
      info.var1 = info1;
      info.var2 = info2;
      }
    };
    
    template <>
    struct FillInDecodingInfos<false>
    {
      void addDebugInfos(double info1, double info2, DebugInfo& info) {}
    };
    

    die klasse DebugInfo ist dann genauso geschrieben, also leer bei false
    und ein paar variablen zum sammeln bei true,

    meine Frage ist nun, ob solche konstrukte wirklich zu nichts zerfallen,
    oder ob ich damit overhead erzeuge, welchen ich bei präprozessor-gefummel
    nicht hätte


  • Administrator

    Nicht damit du noch weiter abrutschst und am Ende gar keine Antwort bekommst, so gebe ich dir jetzt eine, welche zwar vielleicht nicht ganz zufrieden stellt.

    Ich denke es wir von Compiler zu Compiler unterschiedlich sein, wieviel da wegoptimiert wird und somit die Klasse gestrichen oder nicht. Ich persönlich würde sowas anders lösen, damit es im Release-Modus wirklich weg ist.

    #ifdef _DEBUG
    
      void add_debug_infos(double dInfo1, double dInfo2, DebugInfo& rInfo)
      {
        // Mach irgendwas.
      }
    
      #define ADD_DEBUG_INFOS(x, y, z) add_debug_infos(x, y, z)
    #else
      #define ADD_DEBUG_INFOS(x, y, z) 
    #endif
    

    Und die Verwendung sehe folgendermasen aus:

    // Irgendwo in einer Funktion
    ADD_DEBUG_INFOS(1.0, 2.0, MyInfo); // Oder halt andere Parameter
    

    Wenn _DEBUG nicht definiert ist, dann bleibt bei der verwendeten Zeile wirklich nichts anderes mehr übrig als ein Semikolon und das bevor der Compiler etwas sieht.

    Grüssli


Anmelden zum Antworten