दो समान boost::variant
उदाहरणों a
और b
, अभिव्यक्ति (a == b)
की अनुमति दी है को देखते हुए।क्यों बढ़ावा करता :: संस्करण प्रदान नहीं ऑपरेटर! =
हालांकि (a != b)
अपरिभाषित प्रतीत होता है। ऐसा क्यों है?
दो समान boost::variant
उदाहरणों a
और b
, अभिव्यक्ति (a == b)
की अनुमति दी है को देखते हुए।क्यों बढ़ावा करता :: संस्करण प्रदान नहीं ऑपरेटर! =
हालांकि (a != b)
अपरिभाषित प्रतीत होता है। ऐसा क्यों है?
की अवधि में मुझे लगता है कि यह सिर्फ पुस्तकालय के लिए न जोड़ लिया। Boost.Operators वास्तव में मदद नहीं करेंगे, क्योंकि या तो संस्करण boost :: ऑपरेटर :: equality_comparable से लिया गया होगा। डेविड पियरे का कहना है कि आप इसका उपयोग कर सकते हैं, लेकिन आपकी प्रतिक्रिया भी सही है, नया ऑपरेटर! = एडीएल द्वारा नहीं मिलेगा, इसलिए आपको एक प्रयोग ऑपरेटर की आवश्यकता होगी।
मैं इसे बूस्ट-उपयोगकर्ता मेलिंग सूची पर पूछूंगा।
@ AFoglia की टिप्पणी से संपादित करें:
सात महीने बाद, और मैं Boost.Variant का अध्ययन कर रहा हूँ, और मैं चूक सूचियों का यह बेहतर व्याख्या से अधिक ठोकर।
http://boost.org/Archives/boost/2006/06/105895.php
operator==
कॉल संस्करण में वास्तविक वर्ग वर्तमान के लिए operator==
। इसी तरह operator!=
पर कॉल करने से कक्षा के operator!=
पर भी कॉल करना चाहिए। (क्योंकि, सैद्धांतिक रूप से, एक वर्ग को परिभाषित किया जा सकता है, इसलिए a!=b
!(a==b)
जैसा नहीं है।) तो यह एक और आवश्यकता को जोड़ देगा कि संस्करण में कक्षाओं में operator!=
है। (आप मेलिंग सूची सूत्र में यह धारणा बना सकते हैं या नहीं इस पर एक बहस नहीं है।)
सात महीने बाद, और मैं बूस्ट.विरिएंट का अध्ययन कर रहा हूं, और मैं चूक के इस बेहतर स्पष्टीकरण पर चिल्लाता हूं http://lists.boost.org/Archives/boost/2006/06/105895.php। वर्तमान में संस्करण में वास्तविक वर्ग के लिए ऑपरेटर == कॉल ऑपरेटर ==। इसी तरह ऑपरेटर को कॉल करना! = कक्षा के ऑपरेटर को भी कॉल करना चाहिए! = वर्ग के। (क्योंकि, सैद्धांतिक रूप से, एक वर्ग को परिभाषित किया जा सकता है! = बी समान नहीं है! (ए == बी)।) तो यह एक और आवश्यकता को जोड़ देगा कि संस्करण में कक्षाओं में ऑपरेटर है! =। (इस पर एक बहस है कि क्या आप मेलिंग सूची धागे में यह धारणा कर सकते हैं।) – AFoglia
क्योंकि इसकी आवश्यकता नहीं है।
बूस्ट एक operators library जो ऑपरेटर को परिभाषित करता है है! = ऑपरेटर ==
मैं गलत हो सकता था। लेकिन यदि संस्करण ऑपरेटर लाइब्रेरी का उपयोग करता है, तो इसका मतलब यह नहीं है कि एक! = बी * चाहिए * काम करना चाहिए? मुझे लगता है कि वह क्या चाहता है इसके बजाय std :: rel_ops का उपयोग कर रहा है: {std :: rel_ops :: ऑपरेटर! =; getA()! = getB(); } –
मुझे यह कहना नहीं था कि संस्करण स्वयं lib का उपयोग कर रहा है, लेकिन आप ऑपरेटर इंजेक्ट करने के लिए इसे स्वयं कर सकते हैं! = –
तो उम्मीद है कि अतिरिक्त शीर्षलेख शामिल करना और स्रोत फ़ाइलों में उपयोग की घोषणा करना है जहां! = है चाहा हे? –
यह a link to the answer from the author himself है जब इस सवाल को बढ़ावा देने मेलिंग सूची
पर तैयार किया गया था यह संक्षेप में लेखक की राय में, तुलना ऑपरेटरों को लागू करने (! = और <) वेरिएंट प्रकार बनाने के लिए उपयोग किए जाने वाले प्रकारों पर अधिक आवश्यकताएं जोड़ देंगे।
मैं हालांकि देखने की अपनी बात से सहमत नहीं है, के बाद से! =, == के रूप में एक ही तरीके से लागू किया जा सकता जरूरी संस्करण
बनाने प्रकारों में से प्रत्येक के लिए इन ऑपरेटरों के संभव कार्यान्वयन छुपा के बिना
(! (ए == बी)) == (ए! = बी) – dragonfly
मेरी समझ में इसकी वजह से 'मानचित्र' चेहरे के लिए '==' की आवश्यकता है, (साथ ही 'हैश_वल्यू') लेकिन ऑपरेटर! = लक्जरी है :) –