Tôi có một lớp C++ mà tôi cần để xác định một bộ so sánh nên xem xét kết quả của một số phương pháp có khả năng tốn kém. Tôi không muốn cache kết quả của các phương thức này cho tất cả các đối tượng trong tập của tôi, bởi vì các tiêu chí có mức ưu tiên cao nhất là rẻ hơn, và tôi mong đợi những cái rất đắt ở phía dưới chỉ kích hoạt trong những trường hợp hiếm hoi.C++ so sánh lười biếng sâu với cú pháp thanh lịch?
Nếu tôi có hàm cmp() trả về -1, 0 hoặc 1 khi đối số đầu tiên nhỏ hơn, bằng hoặc lớn hơn đối số thứ hai, và với toán tử logic giữ nguyên số nguyên, tôi có thể dễ dàng viết
int compare(const Class &rhs) const {
return cmp(expensive_method_a(), rhs.expensive_method_b()) ||
cmp(expensive_method_b(), rhs.expensive_method_b()) ||
...
}
Đáng tiếc là tôi cần phải làm việc với các nhà điều hành <, vì vậy nó trở nên xấu xí, tốn kém, và dễ bị lỗi:
bool operator<(const Class &rhs) const {
return expensive_method_a() < rhs.expensive_method_a() ||
(expensive_method_a() == rhs.expensive_method_a() &&
(expensive_method_b() < rhs.expensive_method_b() ||
(expensive_method_b() == rhs.expensive_method_b() &&
(...
))))
}
Hoặc cách khác, ít tốn kém nhưng vẫn còn khá xấu xí:
Tôi đã đọc về std :: tie tại This câu hỏi khác, nhưng nếu tôi hiểu chính xác, tie sẽ đánh giá tất cả các phương pháp của tôi trước khi bắt đầu comparaison, và tôi muốn các đối số được lazily đánh giá.
Tôi nghĩ về việc xác định một macro tiền xử lý như thế này:
#define CUT_COMPARE(a,b) { auto _x = (a); auto _y = (b); if (_x != _y) return (_x < _y); }
Rằng tôi sẽ sử dụng như:
bool operator<(const Class &rhs) const {
CUT_COMPARE(expensive_method_a(), rhs.expensive_method_a());
CUT_COMPARE(expensive_method_b(), rhs.expensive_method_b());
...
}
hy vọng rằng niềng răng sẽ kèm theo _x
tôi và _y
trong một phạm vi tư nhân, nhưng than ôi, clang++
than phiền nhiều định nghĩa của _x
và _y
.
Có cách nào đẹp hơn không?
Tại sao tiếng kêu kêu la? Đã không kiểm tra mã, nhưng có vẻ như các biến nằm trong phạm vi riêng biệt. –
Cũng giống như một lưu ý, 'CUT_COMPARE' thực sự nên được viết '#define CUT_COMPARE (a, b) do {....} trong khi (0)' vì những lý do được tìm thấy ở đây: http://stackoverflow.com/questions/ 1067226/c-multi-line-macro-do-while0-vs-scope-block –