2013-02-19 16 views
0

我有一個自定義列表類,並希望支持使用STL中已知的「比較運算符」的操作。例如:C++:如何讓自己的比較運算符()?

std::list<MyClass> d; 
struct not_key { 
    not_key(std::string const& str) : str_(str) {} 

    bool operator(MyClass& elem) { 
     return !elem.findThatThing(); 
    } 

    std::string str_; 
}; 


not_key comp("value"); 
d.remove_if(comp); 

mylist<MyClass> e(d); 
e.filter(comp); 

而我正在努力接受這些「一般」比較運算符的方法的簽名。由於它們都有不同的類型,我不想要靜態成員函數。我怎樣才能添加一個方法到我的類接受比較運算符?

非常感謝! :)

回答

4

如果你的意思是你想知道MYLIST的簽名::篩選你可能只是使其與強的鬆或模板的類型相似。

template< typename T > 
class mylist 
{ 
    public: 
     template< typename Pred > 
     void filter(Pred pred) 
     { 
      // implement, calling pred(elem) for each element or pred(*iter) 
     } 
}; 

注意,您可以通過免費的功能,這個模板的功能,並且在C++ 11,你就可以在一個lambda通過。

如果你想要的東西,是不是一個模板(比元素類型等),你可以使用一個boost::function(或std::function

+0

...如果你想在類之外的函數定義(儘管它應該仍然在頭文件中),你需要'template template inline void mylist :: filter(Pred pred){/ * ... * /}' – aschepler 2013-02-19 15:07:59

1

簽名應該是:

bool operator()(Myclass const & elem) const 
+0

可能是真的,但不是一個答案。 – aschepler 2013-02-19 15:03:53

3

標準功能(如std::sort)使用該推導出的模板的參數成爲你比較函數狀物體的類型:

template <class UnaryPredicate> 
void filter(UnaryPredicate func) { 
    // Call it like: 
    func(something); 
} 

現在UnaryPredicate將被推斷爲您傳遞給它的任何類似功能的對象的類型。 UnaryPredicate比調用它作爲比較函數更有意義,因爲它只需要一個參數。比較函數通常需要兩個參數並進行比較。

或者,你可以採取std::function<bool(const MyClass&)>

void filter(std::function<bool(const MyClass&)> func) { 
    // Call it like: 
    func(something); 
}