12 Stimmen

Faule Parameterauswertung

Ich füge ein bisschen Tracing- und Debugging-Code in eine Klasse ein, die ich gerade überarbeite.

Ich habe eine Trace Objekt, das über einige Filtereigenschaften und -methoden verfügt bool CanTrace(Level, , TracePropertyList = no_additional_properties) y bool Trace(Level, string, TracePropertyList = no_additional_properties) .

Es gibt bereits viele Stellen im Code, an denen dieses Trace-Objekt verwendet wird, und das String-Argument der Trace Methode ist in der Regel ein Ausdruck, den ich nicht auswerten möchte, wenn ich nicht am Ende Informationen zur Ablaufverfolgung ausgeben möchte.

Wiederholung des Codestücks

if(trace.CanTrace(LEVEL_INFO, some_props))
  trace.Trace(LEVEL_INFO, consume_time().to_str(), some_props);

ist hässlich, und ich hätte gern etwas Kürzeres.

Ich habe über die Makros nachgedacht

#define TRACE_WITH_PROPS(LEVEL,STRING,PROPS) //...

y

#define TRACE(LEVEL,STRING) //...

Gibt es eine bessere Möglichkeit, dies zu tun? Möglicherweise mit Vorlagen oder C++11? Ich mag es nicht, Dinge mit Defines vor dem Compiler zu verstecken, und ich tue mein Bestes, um einige Makros an anderer Stelle in dieser Codebasis zu entfernen.

0voto

Flame Punkte 2086

Dies ist meine schnelle Lösung.

class Logger
{
public:
    Logger():m_lvl(0){;}
    void level(int i){m_lvl=i;}
    void log(int level, std::function<std::string(void)> fun)
    {
        if (level <= m_lvl)
        {
            std::cout << fun() << std::endl;
        }
    }
private:
    int m_lvl;
};
class Foo
{
public:
    Foo():m_a(3), m_b(5){;}
    void run()
    {
        Logger l;
        int c = m_b;
        std::cout << "Running" <<std::endl;
        auto lambda = [&](int my, int log)->std::string {
            std::cout <<"Consume while logging set to "<< log << " and my message level is "<< my << std::endl;
            return (std::string(this->m_a, 'a') + std::string(c, 'c'));
        };
        // The bind/lambda is just to show the different levels
        l.log(0, [=]{return lambda(0, 0);} );
        l.log(1, [=]{return lambda(1, 0);} );
        l.level(5);
        l.log(1, [=]{return lambda(1, 5);});
    }
private:
    int m_a, m_b;
};

int main()
{
    Foo f;
    f.run();
    return 0;
}

Ausgabe

Laufen
Verbrauchen während der Protokollierung auf 0 gesetzt und mein Nachrichtenlevel ist 0
aaaccccccc
Verbrauchen während der Protokollierung auf 5 eingestellt und mein Nachrichtenlevel ist 1
aaaccccccc

Wir haben keine Zeit damit verbracht, eine Meldung der Stufe 1 auszugeben/zu berechnen, wenn die Protokollstufe 0 eingestellt ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X