2016-11-02 21 views
7

Để sử dụng một chức năng tiêu chuẩn như std::sort trên một số container tiêu chuẩn Container<T>Comparer mà có thuộc tính truy nã

struct T{ 
    int x,y; 
}; 

dựa trên giá trị y, bạn cần phải viết một cái gì đó tương tự (ví dụ):

std::vector<T> v; 
//fill v 
std::sort(v.begin(),v.end(),[](const auto& l,const auto& r){ 
    return l.y<r.y; 
}); 

Bộ so sánh được viết dưới dạng hàm lambda được sử dụng quá nhiều và được viết lại nhiều lần trong mã cho các lớp và thuộc tính khác nhau.

Xét trường hợp y 's loại có thể so sánh (hoặc như int hay có một tình trạng quá tải cho các < operator), có cách nào để đạt được một cái gì đó như:

std::sort(v.begin(),v.end(),imaginary::less(T::y)); // Imaginary code 

Có thể trong C++ để viết một chức năng như less? hoặc bất cứ điều gì tương tự?

Tôi hỏi vì tôi nhớ một số thứ như thế trong một số ngôn ngữ được quản lý (tôi không chắc chắn có thể là C# hoặc Java). Tuy nhiên, tôi không chắc chắn về thông tin này nếu nó có đúng hay không.

+2

bạn sẽ được hài lòng với mã mà cho phép bạn nói 'member_less ()'? –

+0

@Nathan: Nhưng điều đó không cho phép bạn chọn thành viên để sắp xếp theo, tại cuộc gọi đến 'std :: sort'. –

+0

@BenVoigt Ah. Tôi không thấy đó là những gì OP đang cố gắng làm. tôi ngớ ngẩn quá. – NathanOliver

Trả lời

7
template<typename T, typename MT> 
struct memberwise_less 
{ 
    MT T::* const mptr; 
    auto operator()(const T& left, const T& right) const 
    { return (left.*mptr) < (right.*mptr); } 
}; 

template<typename T, typename MT> 
memberwise_less<T, MT> member_less(MT T::*mptr) 
{ 
    return { mptr }; 
} 

và sau đó bạn có thể làm

std::sort(v.begin(), v.end(), member_less(&T::y)); 
+0

Đây không phải là biên dịch thử nghiệm ... nếu bạn chia sẻ một trường hợp thử nghiệm tạo ra vectơ, in kết quả, v.v., tôi sẽ rất vui khi thêm điều này vào thử nghiệm. –

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