トレース、デバッグ、情報、エラーなど、いくつかのレベルのログがあると仮定しましょう。次のコードを書く方法があるかどうか疑問に思いました。
enum log_level = {trace, debug, info, error};
log_level global_log_level = info;
void log(log_level level, string& message){
if (level >= global_log_level){
std::cout << message << std::endl;
}
}
string create_message(){
...
}
log_level level = debug;
log (level, create_message());
レベルがglobal_severity_levelよりも小さい場合、create_messageは呼び出されません。実際、create_messageは非常に長くなる可能性があり、文字列を作成する対象が何であってもです。「デバッグ」ログが多数ある場合、非デバッグモードで実行すると、それらのログがかなりのオーバーヘッドになる可能性があります。
関数「log」がマクロであり、severity> minimum_severityの場合にのみcreate_message()を呼び出す場合、これを行うことが可能であることを私は知っています。しかし、マクロなしでこれを行う別の方法はありませんか?
編集
上記では、create_messageを指定しませんでした。これは、特に次のようなものである可能性があるためです。
log(level, "Created object " + my_object.getName());
この場合、プログラマーがログを呼び出すための比較的透過的な方法で、完全な文字列が作成されないようにログを書き込む方法はありますか?
どうもありがとう