2012-07-06 30 views
5
class Widget; 

std::vector< std::shared_ptr<Widget> > container 

class Criterium 
{ 
public: 
    bool operator()(const Widget& left, const Widget& right)const; 
}; 

Làm thế nào tôi có thể sắp xếp container theo criterium, mà không định criterium khác như:Cách sắp xếp vùng chứa std :: shared_ptr <Widget> objects?

class CriteriumForPointers 
{ 
public: 
    bool operator()(const std::shared_ptr<Widget>& left, 
        const std::shared_ptr<Widget>& right)const; 
}; 
+0

Ý tôi là, có một số C++ 11 magic tôi có thể sử dụng không? Xác định một số đối tượng hàm đang chạy, ngay trước lệnh std :: sort, ... –

Trả lời

8

Bạn có thể sử dụng một lambda như một n adapter:

Criterium criterium; 
sort(container.begin(), container.end(), 
    [&criterium] (const shared_ptr<Widget> &l, const shared_ptr<Widget> &r) 
    { 
     return criterium(*l.get(), *r.get()); 
    } 
); 
+0

Cool! Đó là những gì tôi đang tìm kiếm, nhưng không đủ thông minh để phát minh ra bản thân mình! –

+0

Sử dụng tham chiếu const cho con trỏ được chia sẻ trong trường hợp này, bạn đang tạo bản sao/đồng bộ hóa không cần thiết. – Klaim

+0

@Kêu mừng: Rõ ràng là nhìn lại, không biết tại sao tôi bỏ lỡ điều đó. Cảm ơn thông báo. – Jon

1

Có lẽ bạn có thể đặt một tình trạng quá tải thứ hai của các nhà điều hành() vào bạn criterium-classe, như này:

class Criterium { 
    bool operator()(const Widget& left, const Widget& right)const; 
    bool operator()(const std::shared_ptr<Widget>& left, 
        const std::shared_ptr<Widget>& right)const 
    { return operator()(*left, *right); } 
}; 

(lưu ý: tôi đã không kiểm tra này)

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