2015-11-11 20 views
5

Esiste un predicato standard per confrontare gli oggetti gestiti shared_ptr per l'uguaglianza.confronta shared_ptr object ugality

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

Voglio qualcosa di simile al codice di cui sopra, ma eviterà che definisce la mia auto se esiste già una soluzione standard.

+2

v'è la necessità in quanto si possono deferenza? – 101010

+3

@ 101010: l'istruzione 'if' è presente perché a quanto pare potresti non essere in grado di dereferenziarli. – MSalters

+1

Ma ho bisogno di occuparmi di nulptr durante il loro dereferenziamento –

risposta

6

No, non esiste un tale predicato. Un'alternativa è usare la funzione lambda, ma devi comunque definirla tu stesso.

2

No, non esiste una soluzione standard. L'operatore di uguaglianza di shared_ptr e simili confronta solo i puntatori e non gli oggetti gestiti. La tua soluzione va bene. Propongo questa versione che controlla se l'oggetto appuntito è lo stesso e restituisce false se uno dei puntatori condivisi è nullo e l'altra non lo è:

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

Questo restituisce 'false' quando un puntatore è nullo, mentre la versione di OP restituisce' true'. – Quentin

+0

Infatti. Potrei argomentare che ha più senso restituire false quando un puntatore condiviso è nullo e l'altro non lo è, ma ancora una volta la versione di OP è diversa. Modificato la risposta per riflettere questo. – fortuna