Giả sử chúng ta có nhiều cấp độ ghi nhật ký: theo dõi, gỡ lỗi, thông tin, lỗi. Tôi đã tự hỏi nếu có một cách để viết các đoạn mã sau:Đăng nhập lơ lửng trong C++
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());
mà không create_message được gọi nếu mức nhỏ global_severity_level đó. Thật vậy, create_message có thể khá dài, và không có vấn đề gì nó tạo ra một chuỗi. Nếu có nhiều nhật ký "gỡ lỗi", những nhật ký đó có thể trở thành chi phí đáng kể khi chạy ở chế độ không gỡ lỗi.
Tôi biết có thể làm như vậy nếu hàm "nhật ký" là macro, gọi hàm create_message() chỉ khi mức độ nghiêm trọng> minimal_severity; nhưng không có cách nào khác để làm điều này nếu không có macro?
EDIT
Ở phía trên, tôi không nói rõ create_message, bởi vì nó có thể là bất cứ điều gì, cụ thể:
log(level, "Created object " + my_object.getName());
Trong trường hợp này, là có một cách để viết log như vậy rằng chuỗi đầy đủ không được tạo ra, theo cách tương đối minh bạch cho nhật ký gọi lập trình viên?
Rất cám ơn
Bạn có thể có 'create_message()' kiểm tra 'global_log_level'. – NPE
Bạn có thể chuyển một hàm 'create_message' vào' log() 'vì vậy' log() 'sẽ chỉ xây dựng thông điệp đắt tiền nếu mức thích hợp? – JaredC
Xin chào, tôi tham khảo một hàm không xác định create_message() vì thông báo có thể đến từ bất kỳ đâu, nhưng nó có thể được viết khi đang bay, như nhật ký (cấp độ, "Đối tượng" + my_object.getName() + "đã được tạo") ; - trong trường hợp này tôi không thể chuyển bất kỳ thứ gì tới hàm create_message(), mà về cơ bản là toán tử + giữa 2 chuỗi ... Và tôi không thể chuyển nó thành hàm log ... – GHL