Có cách nào/giải pháp khác để truy cập các thành viên không phải của OuterClass từ bên trong toán tử hàm so sánh() không?
Có. Chỉ cần viết một constructor người dùng định nghĩa cho Compare
chấp nhận và lưu trữ một tham chiếu đến OuterClass
, theo cách này:
struct Compare
{
Compare(OuterClass& o) : oc(o) { }
bool operator()(const T&, const T&)
{
// Uses oc somehow...
}
private:
OuterClass& oc;
};
Sau đó, khi bạn tạo thiết lập của bạn, bạn có thể làm điều gì đó như:
int main()
{
typedef std::set<T, Compare> MySet;
OuterClass oc; // <== Construct an object of type Outerclass somehow...
MySet ms(Compare(oc)); // <== Construct your comparator and pass it
// in input to the constructor of std::set
}
Hãy coi chừng Mặc dù: tiêu chí đặt hàng sẽ vẫn ổn định. Các phần tử phải luôn luôn giống nhau cho cùng một tập hợp. Mỗi đoạn 23.2.4/3 của C++ 11 Tiêu chuẩn:
Cụm từ “tương đương phím” có nghĩa là quan hệ tương đương áp đặt bởi sự so sánh và không phải là operator==
trên phím. Tức là, hai phím k1
và k2
được coi là tương đương nếu đối chiếu đối tượng comp
, comp(k1, k2) == false && comp(k2, k1) == false
. Đối với bất kỳ hai khóa k1 và k2 nào trong số vùng chứa giống nhau, hãy gọi comp(k1, k2)
sẽ luôn trả về cùng một giá trị.
Nguồn
2013-04-28 09:29:54
Ah, tôi quên nhìn vào các nhà xây dựng thiết lập, vì vậy tôi đã không nhận ra rằng tôi có thể tạo đối tượng so sánh bằng của riêng tôi. Cảm ơn bạn đã tip về tiêu chuẩn C++ 11 - Tôi lưu ý điều này :) Cảm ơn rất nhiều! – schoettl
@ user999007: Bạn được chào đón, chúc bạn may mắn với dự án của mình;) –