2013-08-17 39 views
10

Tôi đã thấy rằng, nếu bạn có operator<, bạn có thể thực hiện, giả sử, operator>=!(a < b). Tuy nhiên, khi tôi đến Ủy ban C++ ở Bristol, họ nói rằng bạn có thể thực hiện tất cả các toán tử so sánh theo cách này. Đặc biệt, khi xem xét các loại có toán tử so sánh không tầm thường (xem xét một chuỗi dài tùy ý, đặc biệt nếu đây là Unicode), điều này có thể được thực hiện chỉ với một cuộc gọi đến operator<. Tôi không thể hình dung được điều này có thể được thực hiện như thế nào.Triển khai các toán tử so sánh khác về toán tử <trong một cuộc gọi

Làm cách nào để triển khai operator>operator<= chỉ với một cuộc gọi tới operator< và không có cuộc gọi nào đến các toán tử so sánh khác?

+0

Tôi không chắc chắn abt chỉ '<' nhưng ['std :: rel_ops'] (http://en.cppreference.com/w/cpp/utility/rel_ops/operator_cmp) có thể làm chúng với' == ' và '<' –

+0

Giống như ví dụ của riêng bạn: 'a> b' bằng với'! (a == b || a usr2564301

+0

Điều đó cũng liên quan đến một cuộc gọi đến toán tử ==, điều này rõ ràng sẽ kém hiệu suất hơn so với toán tử tùy chỉnh>. – Puppy

Trả lời

16
  • a > b == b < a
  • a <= b == !(b < a)
  • a >= b == !(a < b)

Nó thậm chí còn có thể thực hiện bình đẳng về ít hơn (Loại lạm dụng meta-cú pháp của tôi ở đây):

  • (a == b) == (!(a < b) && !(b < a))
  • (a != b) == (a < b || b < a)

Mặc dù tôi không đề xuất thực hiện điều này vì nó đòi hỏi hai so sánh và thường có thể được triển khai trực tiếp hiệu quả hơn.

+0

Tôi đã thấy :-) Tôi đã xóa nhận xét – xanatos

+2

Điều này rõ ràng không hoạt động nếu một người muốn triển khai logic ba trạng thái như trong SQL – xanatos

+1

+1 Và phiên bản cuối cùng ... (! (A xanatos

Các vấn đề liên quan