2012-07-06 38 views
5
class Widget; 

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

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

我怎樣才能根據繞圈,排序的容器,但未定義像另一個繞圈:如何對std :: shared_ptr <Widget>對象的容器進行排序?

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

我的意思是,有一些C++ 11的魔法可以使用嗎?在運行時定義一些函數對象,就在std :: sort命令之前,... – 2012-07-06 07:52:00

回答

8

你可以使用一個lambda作爲一個型適配器:

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

很酷!那正是我在尋找的,但是沒有足夠聰明來發明自己! – 2012-07-06 07:54:14

+0

在這種情況下,使用const引用指向共享指針,您正在進行不必要的複製/同步。 – Klaim 2012-07-06 08:01:28

+0

@Klaim:回想起來很明顯,不知道爲什麼我錯過了。感謝您的通知。 – Jon 2012-07-06 08:03:00

1

也許你可以把運營商的第二個過載()到您的繞圈-CLASSE,像這樣的:

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); } 
}; 

(注:我沒有測試這個)

相關問題