2015-11-11 6 views
5

Gibt es ein Standardprädikat, um shared_ptr verwaltete Objekte auf Gleichheit zu vergleichen.Vergleichen shared_ptr Objektgleichheit

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

Ich möchte etwas ähnliches wie der oben genannte Code, aber werde es vermeiden, mich selbst zu definieren, wenn es bereits eine Standardlösung gibt.

+2

ist es notwendig, da Sie sie Ehrerbietung können? – 101010

+3

@ 101010: Die 'if'-Anweisung ist da, weil Sie sie scheinbar nicht dereferenzieren können. – MSalters

+1

Aber ich muss mit Nulptr befassen, wenn Dereferenzierung sie –

Antwort

6

Nein, es gibt kein solches Prädikat. Eine Alternative ist die Verwendung der Lambda-Funktion - Sie müssen sie jedoch selbst definieren.

2

Nein, es gibt keine Standardlösung. Der Gleichheitsoperator von shared_ptr und ähnlichem vergleicht nur die Zeiger, nicht die verwalteten Objekte. Ihre Lösung ist in Ordnung. Ich schlage vor, diese Version, wenn der spitze Gegenstand prüft das gleiche ist und gibt false zurück, wenn eine des gemeinsamen Zeigers null ist und der andere es nicht ist:

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

Dies gibt 'false 'zurück, wenn ein Zeiger Null ist, während OP-Version' wahr 'zurückgibt. – Quentin

+0

In der Tat. Ich könnte argumentieren, dass es sinnvoller ist, false zurückzugeben, wenn ein geteilter Zeiger null ist und der andere nicht, aber wiederum ist die Version von OP anders. Bearbeitete die Antwort, um das zu reflektieren. – fortuna