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
Ä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% 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:
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%Tags und Links c++ logging lazy-evaluation