Lazy Anmeldung in C ++

8

Nehmen wir an, dass wir verschiedene Protokollebenen haben: Trace, Debug, Info, Fehler. Ich habe mich gefragt, ob es eine Möglichkeit gibt, den folgenden Code zu schreiben:

%Vor%

ohne dass create_message aufgerufen wird, wenn level kleiner als global_severity_level ist. In der Tat kann create_message ziemlich lang sein, und egal, was es eine Zeichenfolge erstellt. Wenn es viele "Debug" -Protokolle gibt, können diese einen erheblichen Mehraufwand verursachen, wenn sie im Nicht-Debug-Modus ausgeführt werden.

Ich weiß, dass es möglich ist, dies zu tun, wenn die Funktion "log" ein Makro ist und create_message () nur aufruft, wenn der Schweregrad & gt; minimal_Severity; Aber gibt es keinen anderen Weg, dies ohne Makros zu tun?

BEARBEITEN

Im obigen Beispiel habe ich create_message nicht angegeben, weil es alles Mögliche sein kann, insbesondere:

%Vor%

Gibt es in diesem Fall eine Möglichkeit, das Protokoll so zu schreiben, dass die vollständige Zeichenfolge nicht auf relativ transparente Weise für den Programmierer erstellt wird, der das Protokoll aufruft?

Vielen Dank

    
GHL 02.02.2013, 18:42
quelle

4 Antworten

5

Ähnlich wie @sftrabbit, aber wie von @ipc vorgeschlagen.

Verwenden Sie eine Vorlage, um die std :: function-Maschinerie zu vermeiden, und der Compiler kann dies vielleicht inline machen und wird hoffentlich schneller sein.

%Vor%     
Scott Langham 02.02.2013, 19:31
quelle
6

Es gibt mehrere Alternativen. Eine interessante Möglichkeit besteht darin, create_message als std::function<std::string()> zu übergeben und sie innerhalb von log aufzurufen:

%Vor%

Dann würdest du es so nennen:

%Vor%

Dies kann mit beliebigen Ausdrücken als Argumenten funktionieren, wenn Sie sie in ein Lambda einfügen:

%Vor%

Wenn Sie wirklich nicht möchten, dass Argumente überhaupt ausgewertet werden (wie Sie in den Kommentaren beschrieben haben), dann müssen Sie die Ebene außerhalb des Aufrufs überprüfen:

%Vor%     
Joseph Mansfield 02.02.2013 18:50
quelle
1

@sftrabbit Antwort ist bevorzugt. Aber nur, wenn Sie log () nicht ändern möchten, können Sie es aufrufen:

%Vor%     
qPCR4vir 02.02.2013 18:58
quelle
1

Sie können ein Makro erstellen

%Vor%

Wenn Sie jetzt

anrufen


    #define log(level, message) { \
    if(level >= global_log_level) {\
    cout &lt&lt message; }}

create_message wird nur aufgerufen, wenn der Debug-Level der gewünschte ist.     
strannik 02.02.2013 19:25
quelle

Tags und Links