2012-10-30 35 views
0

在線無法輕鬆找到解決方案...執行std :: equal與tr1 :: shared_ptr類型

我有類似以下內容。

class Color { 
    public: 
    Color(std::string n) : name(n) {} 
    typedef std::tr1::shared_ptr<Color> Ptr; 
    std::string name; 
}; 

同時別處......

void Function() 
{ 
    std::vector<Color::Ptr> myVector; 
    Color::Ptr p1 = Color::Ptr(new Color("BLUE")); 
    Color::Ptr p2 = Color::Ptr(new Color("BLUE")); 

    // Note: p2 not added. 
    myVector.push_back(p1); 

    // This is where my predicament comes in.. 
    std::find(myVector.begin(), myVector.end(), p2); 
} 

我怎麼會寫這個,所以我的std ::發現實際上尊重的smart_pointers和比較對象的字符串,而不是他們的內存地址?我的第一種方法是編寫自定義的std :: equal函數,但它不接受模板作爲自己的模板類型。

+0

讓我們看看你已經嘗試了什麼...... –

回答

2

最簡單的可能是使用find_if

template <typename T> 
struct shared_ptr_finder 
{ 
    T const & t; 

    shared_ptr_finder(T const & t_) : t(t_) { } 

    bool operator()(std::tr1::shared_ptr<T> const & p) 
    { 
     return *p == t; 
    } 
}; 

template <typename T> 
shared_ptr_finder<T> find_shared(std::tr1::shared_ptr<T> const & p) 
{ 
    return shared_ptr_finder<T>(*p); 
} 

#include <algorithm> 

typedef std::vector< std::tr1::shared_ptr<Color> >::iterator it_type; 
it_type it1 = std::find_if(myVector.begin(), myVector.end(), find_shared(p2)); 
it_type it2 = std::find_if(myVector.begin(), myVector.end(), shared_ptr_finder<Color>(*p2)); 
+0

謝謝,作品完美 – bgura

1

您可以實現:

bool operator==(Color::Ptr const & a, Color::Ptr const & b); 

或者,你可以使用std::find_if和實施謂詞,將工作,你怎麼想。

在C++ 11,它可能看起來像:

std::find_if(myVector.begin(), myVector.end(), [&](Color::Ptr & x) { return *p2 == *x }); 
+0

如果OP是使用TR1,她可能沒有C++ 11。 –

+0

@KerrekSB:我同意。但是,將該lambda轉換爲函數並不難。 –

相關問題