2015-11-11 19 views
5

Có một vị từ chuẩn để so sánh shared_ptr đối tượng được quản lý cho bình đẳng.so sánh shared_ptr đối tượng bình đẳng

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

Tôi muốn một cái gì đó tương tự như mã trên, nhưng sẽ tránh tự xác định nếu tôi đã có giải pháp chuẩn.

+2

có cần thiết không? – 101010

+3

@ 101010: Câu lệnh 'if' là có bởi vì dường như bạn có thể không có khả năng dereference chúng. – MSalters

+1

Nhưng tôi cần phải đối phó với nulptr khi dereferencing chúng –

Trả lời

6

Không, không có biến vị ngữ như vậy. Một cách khác là sử dụng hàm lambda - nhưng bạn vẫn cần tự định nghĩa nó.

2

Không, không có giải pháp chuẩn. Toán tử bình đẳng của shared_ptr và những thứ tương tự chỉ so sánh con trỏ không phải là đối tượng được quản lý. Giải pháp của bạn là tốt. Tôi đề xuất phiên bản này để kiểm tra xem đối tượng nhọn có giống nhau không và trả về false nếu một trong các con trỏ được chia sẻ là null và một con trỏ khác không phải là:

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

Điều này trả về 'false' khi một con trỏ là null, trong khi phiên bản của OP trả về' true'. – Quentin

+0

Thật vậy. Tôi có thể lập luận rằng nó có ý nghĩa hơn để trả về false khi một con trỏ được chia sẻ là null và một con trỏ khác thì không, nhưng một lần nữa phiên bản của OP lại khác. Đã chỉnh sửa câu trả lời để phản ánh điều đó. – fortuna

Các vấn đề liên quan