2011-04-19 21 views
8

shared_ptr के लिए समानता ऑपरेटर के रूप में निम्नानुसार परिभाषित किया गया है:सी ++ shared_ptr समानता ऑपरेटर

template<class T, class U> inline bool operator==(
    shared_ptr<T> const & a, shared_ptr<U> const & b) 
{ 
    return a.get() == b.get(); 
} 

यह टूट लगता है। क्या समानता को आगे बढ़ाने के लिए बेहतर नहीं होगा कि ए और बी क्या इंगित कर रहे हैं? या पुस्तकालय के उपयोगकर्ताओं पर यह एक अनुचित प्रतिबंध होगा (उस में उन्हें समानता ऑपरेटर प्रदान करना होगा)?

यदि मेरे पास कोई नक्शा या हैश_टेबल है जिसमें shared_ptrs हैं, तो वर्तमान परिभाषा समानता को अनुपयोगी बनाती है। उदाहरण के लिए, पर विचार

std::map<int, std::tr1::shared_ptr<T> > m1, m2; 

हम चाहते हैं कि प्रत्येक के लिए ptrs एम 1 में int जाँच करना चाहते हैं नहीं होगा और एम 2 एक ही मूल्य की ओर इशारा करते हैं?

मैं एम 1, एम 2 आउट (प्रत्येक से सेट का निर्माण, रास्ते में shared_ptrs dereferencing) से सेट करके अपनी खुद की समानता लागू कर सकता हूं। क्या कोई एसटीएल चाल है जो या साझा_प्टर्स की उपस्थिति में समानता का परीक्षण करने के किसी अन्य तरीके को अच्छी तरह से पूरा करेगी?

+7

यह समानता से आपका क्या मतलब है इस पर निर्भर करता है। साधारण पॉइंटर्स के लिए जिसका अर्थ है "एक ही ऑब्जेक्ट को इंगित करना"। मेरे लिए समानता की इस अवधारणा को share_pointer में विस्तारित करना उचित लगता है। –

उत्तर

5

मुझे लगता है कि विचार यह है कि दो shared_ptr उदाहरणों की तुलना दो बिंदुओं की तुलना में उपयोगी है। यदि आप std::mapshared_ptr s या ऑब्जेक्ट्स के सादे पुराने पॉइंटर्स चाहते हैं, तो आपको किसी भी मामले में पॉइंट-टू ऑब्जेक्ट्स की तुलना करने वाले किसी चीज़ के साथ पूर्वानुमान को ओवरराइड करना होगा।

दो मानचित्रों की तुलना करने के मामले में, शायद आप std::equal के संस्करण का उपयोग करना चाहते हैं जो एक अनुमान लगाता है।

31

यह टूटा नहीं है, क्योंकि shared_ptr अवधारणात्मक रूप से एक सूचक है, इसलिए यह पॉइंटर-वार समानता लागू करता है। जब आप समानता के लिए दो पॉइंटर्स का परीक्षण करते हैं, तो आप जानना चाहते हैं कि वे स्मृति में एक ही स्थान पर इंगित करते हैं या नहीं।

0

बस एक समस्या में भाग गया जहां मैं दोनों प्रकार के समकक्षता का उपयोग कर सकता था। Shared_ptr का एक अनियंत्रित सेट जहां मैं समकक्ष वस्तुओं की ओर इशारा करते हुए समकक्ष होना चाहता था। इसे हैश के टेम्पलेट विशेषज्ञता और ओवरलोडेड == का उपयोग करके कार्यान्वित किया जा सकता है। अब मेरे पास एक और कंटेनर है जिसमें इन पॉइंटर्स (प्रकार की किनारे की घटना सूची) भी शामिल है, लेकिन चूंकि हम पहले से ही जानते हैं कि वे अद्वितीय हैं क्योंकि हमने सेट का उपयोग किया है, हम पॉइंटर समकक्ष पर भरोसा कर सकते हैं। हालांकि मूल समकक्ष भी काम करेगा, यह दूसरे मामले में सूचक समकक्ष पर भरोसा करने के लिए और अधिक कुशल हो सकता है - यह तुलना की जा रही उदाहरणों में मौजूद डेटा की मात्रा पर निर्भर करता है।

तो, प्रश्न का उत्तर देने के लिए। नहीं, यह बेहतर नहीं होता, क्योंकि आप लचीलापन का उपयोग कैसे करते हैं, हल होने वाली समस्या पर निर्भर करता है।

संबंधित मुद्दे