Khi sử dụng macro variadic bạn cần __VA_ARGS__
để mở rộng tất cả các đối số. Tuy nhiên, vấn đề là các đối số đó được phân cách bằng dấu phẩy. Giả sử nó chỉ tách các đối số cho một cuộc gọi hàm, nhưng vì các macro chỉ hoạt động với văn bản, bạn thực sự có thể sử dụng __VA_ARGS__
trong các ngữ cảnh khác, trong đó danh sách được phân cách bằng dấu phẩy có ý nghĩa.
Bí quyết bạn có thể sử dụng là xác định toán tử dấu phẩy của riêng mình cho std::ostream
(loại std::cout
). Ví dụ:
#include<iostream>
#define LOG(...) std::cout , __VA_ARGS__ , std::endl
template <typename T>
std::ostream& operator,(std::ostream& out, const T& t) {
out << t;
return out;
}
//overloaded version to handle all those special std::endl and others...
std::ostream& operator,(std::ostream& out, std::ostream&(*f)(std::ostream&)) {
out << f;
return out;
}
int main() {
LOG("example","output","filler","text");
return 0;
}
Bây giờ, gọi LOG sẽ mở rộng tới:
std::cout , "example" , "output" , "filler" , "text" , std::endl;
và dấu phẩy sẽ gọi các nhà khai thác dấu phẩy quá tải.
Nếu bạn không muốn quá tải operator,
gây ô nhiễm tất cả std::ostream
-s, bạn có thể đóng gói std::cout
bằng lớp ghi nhật ký đặc biệt của riêng bạn.
Tại sao? Tại sao? Tại sao? chỉ cần viết mã –