2015-11-11 13 views
5

Czy istnieje standardowy predykat do porównywania zarządzanych obiektów shared_ptr dla równości.porównaj równość obiektu shared_ptr

template<typename T, typename U> 
inline bool target_equal(const T& lhs, const U& rhs) 
{ 
    if(lhs && rhs) 
    { 
     return *lhs == *rhs; 
    } 
    else 
    { 
     return !lhs && !rhs; 
    } 
} 

Chcę czegoś podobnego do powyższego kodu, ale uniknę go zdefiniowania, jeśli istnieje już standardowe rozwiązanie.

+2

istnieje potrzeba, ponieważ można je szacunek? – 101010

+3

@ 101010: Wyrażenie "jeśli" istnieje, ponieważ najwyraźniej nie możesz ich usunąć. – MSalters

+1

Ale muszę poradzić sobie z nulptr podczas ich usuwania –

Odpowiedz

6

Nie, nie ma takiego predykatu. Alternatywą jest użycie funkcji lambda - ale nadal musisz ją zdefiniować samodzielnie.

2

Nie, nie ma standardowego rozwiązania. Operator równości shared_ptr i tym podobne porównuje tylko wskaźniki, a nie zarządzane obiekty. Twoje rozwiązanie jest w porządku. Proponuję tę wersję, która sprawdza czy spiczasty przedmiot jest taki sam i zwraca wartość false, jeśli jeden z wspólnych wskaźników jest zerowy, a drugi to nie jest:

template<class T, class U> 
bool compare_shared_ptr(const std::shared_ptr<T>&a,const std::shared_ptr<U>&b) 
{ 
    if(a == b) return true; 
    if(a && b) return *a == *b; 
    return false; 
} 
+0

Zwraca 'false' gdy jeden wskaźnik jest pusty, podczas gdy wersja OP zwraca' true'. – Quentin

+0

Rzeczywiście. Mogę argumentować, że bardziej sensowne jest zwracanie fałszu, gdy jeden współużytkowany wskaźnik ma wartość zerową, a drugi nie jest, ale po raz kolejny wersja OP jest inna. Edytował odpowiedź, aby to odzwierciedlić. – fortuna