2013-08-16 12 views
6

का अभ्यास और खोज मैं boost type erasure पढ़ रहा हूं और मैं संभावित उपयोग को समझने की कोशिश कर रहा हूं। मैं इसे थोड़ा सा अभ्यास करना चाहता हूं, जबकि मैं विषय के बारे में कई दस्तावेज पढ़ रहा हूं (यह एक बड़ा दिखता है)। क्लाइंट और सर्वर के बीच डेटा का नेटवर्किंग/आदान-प्रदान करने वाले एप्लिकेशन का सबसे उद्धृत क्षेत्र। क्या आप कुछ अन्य उदाहरण या अभ्यास का सुझाव दे सकते हैं जहां मैं इस पुस्तकालय के साथ थोड़ा सा खेल सकता हूं?बूस्ट टाइप एरर

+0

पेज 16ff http://accu.org/var/uploads/journals/Overload116.pdf में टाइप एरर – doctorlove

+0

का उपयोग करके डायनामिक सी ++ के बारे में एक लेख है, मैं इसे अभी पढ़ रहा हूं। सुझावों के लिए धन्यवाद। –

+0

मैं नेटवर्किंग के लिए कहूंगा, क्लासिक रनटाइम पॉलीमोर्फिज्म टाइप एरर से अधिक उपयुक्त मुहावरे है। टाइप करें 'std :: shared_ptr' में deleters और आवंटकों को संभालने के लिए मिरर बहुत अच्छा है। –

उत्तर

17

टाइप एरर असाधारण मात्रा में परिस्थितियों में उपयोगी है, उस बिंदु पर जहां इसे वास्तव में मौलिक रूप से अनुपलब्ध भाषा सुविधा के रूप में माना जा सकता है जो ब्रिज जेनेरिक और ऑब्जेक्ट उन्मुख प्रोग्रामिंग शैलियों।

जब हम सी ++ में एक वर्ग को परिभाषित, क्या हम वास्तव में परिभाषित कर रहे हैं दोनों एक बहुत ही विशेष type और एक बहुत ही विशेष interface है, और इन दो चीजों जरूरी संबंधित होने के लिए की जरूरत नहीं है कि। type डेटा से संबंधित है, जहां interface उस डेटा पर परिवर्तन के साथ सौदा करता है। सामान्य कोड, जैसे कि एसटीएल में, type परवाह नहीं करता है, यह interface परवाह करता है: आप std::sort का उपयोग करके किसी भी कंटेनर या कंटेनर-जैसे अनुक्रम को सॉर्ट कर सकते हैं, जब तक यह तुलना और इटरेटर interface प्रदान करता हो।

दुर्भाग्यवश, सी ++ में सामान्य कोड संकलन समय polymorphism की आवश्यकता है: templates। यह ऐसी चीजों में मदद नहीं करता है जिन्हें रनटाइम तक नहीं जाना जा सकता है, या चीजें जिन्हें एक समान इंटरफ़ेस की आवश्यकता होती है।

एक साधारण उदाहरण यह है: आप एक ही कंटेनर में कई अलग-अलग प्रकार कैसे स्टोर करते हैं? सबसे सरल तंत्र सभी प्रकारों को एक शून्य * में स्टोर करना होगा, शायद कुछ प्रकार की जानकारी के साथ उन्हें अलग करने के लिए। एक और तरीका यह है कि इन सभी types को पहचानने के लिए interface है: पुनर्प्राप्ति। अगर हम retrieval के लिए एक इंटरफ़ेस बना सकते हैं, तो प्रत्येक प्रकार के लिए इसे विशेषज्ञ बनाएं, फिर ऐसा होगा कि type का हिस्सा मिटा दिया गया था।

any_iterator यह करने के लिए एक और बहुत ही उपयोगी कारण है: यदि आप एक ही इंटरफेस के साथ विभिन्न कंटेनरों की एक संख्या से अधिक पुनरावृति करने की जरूरत है, तो आप इटरेटर की type से बाहर कंटेनर के type को मिटाने के लिए की आवश्यकता होगी। boost :: any_range इसका एक सूक्ष्म संवर्द्धन है, इसे इटरेटर से श्रेणियों तक विस्तारित करता है, लेकिन मूल विचार समान है।

संक्षेप में, किसी भी समय आप एक ही interface के साथ एक एकल type लिए एक समान interface के साथ कई types से जाने की जरूरत है, तो आप प्रकार विलोपन के कुछ फार्म की आवश्यकता होगी। यह रनटाइम तकनीक है जो संकलित समय टेम्पलेट्स को समझाती है।

+1

हाय। इस बीच, संदर्भ के लिए मैंने थॉमस बेकर http://www.artima.com/cppsource/type_erasure.html http://thbecker.net/free_software_utilities/type_erasure_for_cpp_iterators/any_iterator.html –

+2

दोनों से निम्नलिखित को भी पढ़ा है उत्कृष्ट संसाधन, लेकिन मैंने सोचा कि आप 'किसी भी' या 'any_iterator' या' any_container' से परे, टाइप एरर के लिए अधिक सामान्य आवश्यकता के बारे में जानना चाहेंगे। सदस्य फ़ंक्शन पॉइंटर्स केवल प्रतिनिधियों को लागू करने के लिए मौजूद हैं, यह मामला वर्चुअल फ़ंक्शंस मुख्य रूप से टाइप एरर को अनुमति देने के लिए मौजूद हो सकता है। यह एक अवधारणा का मौलिक है। – Alice

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