यह well known है कि std::vector<bool>
मानक की कंटेनर आवश्यकताओं को पूरा नहीं करता है, मुख्य रूप से क्योंकि पैक किया गया प्रतिनिधित्व T* x = &v[i]
को एक पॉइंटर को एक बूल पर लौटने से रोकता है।एकाधिक प्रॉक्सी कक्षाएं एसटीएल-सबूत बिटकवेक्टर बना सकती हैं?
मेरा प्रश्न है: क्या यह संदर्भ/हटाया जा सकता है जब संदर्भ_प्रॉक्सी operator&
के पते को ओवररेड करता है ताकि pointer_proxy लौटाया जा सके?
पॉइंटर-प्रॉक्सी में अधिकांश कार्यान्वयन में संदर्भ_प्रॉक्सी के समान डेटा हो सकता है, अर्थात् पैक किए गए डेटा में एक पॉइंटर और ब्लॉक के अंदर विशेष बिट को अलग करने के लिए एक मुखौटा। Pointer_proxy का संकेत तब संदर्भ_प्रैक्सी उत्पन्न करेगा। अनिवार्य रूप से दोनों प्रॉक्सी "वसा" पॉइंटर्स हैं, जो डिस्क-आधारित प्रॉक्सी कंटेनर की तुलना में अभी भी हल्के वजन वाले हैं।
T* x = &v[0]
के बजाय auto x = &v[0]
कर सकता है, और बिना 0 समस्याओं के if(*x)
का उपयोग कर सकता है। मैं भी लिखने के लिए for(auto b: v) { /* ... */ }
प्रश्न सक्षम होने के लिए करना चाहते हैं: होगा एसटीएल के एल्गोरिदम के साथ इस तरह के एक बहु प्रॉक्सी दृष्टिकोण काम करता है? या कुछ एल्गोरिदम वास्तव में आवश्यकता पर भरोसा करते हैं कि x
को वास्तविक bool*
होना चाहिए? या क्या लगातार कई उपयोगकर्ता परिभाषित रूपांतरण आवश्यक हैं जो इसे काम करने से रोकते हैं? उपरोक्त कार्यान्वयन स्केच को पूरी तरह से पूरा करने की कोशिश करने से पहले मैं इस तरह के किसी भी बाधा को जानना चाहता हूं।
अद्यतन (@HowardHinnant के उत्तर के आधार पर और इस ancient discussion comp.std.C++ पर)
आप एक लंबा रास्ता लगभग builtin प्रकार की नकल करने के लिए आ सकते हैं: किसी भी प्रकार के टी के लिए , प्रॉक्सी की एक जोड़ी (जैसे context_proxy और iterator_proxy) को इस अर्थ में पारस्परिक रूप से सुसंगत बनाया जा सकता है कि context_proxy :: ऑपरेटर &() और iterator_proxy :: ऑपरेटर *() एक-दूसरे के विपरीत हैं।
हालांकि, कुछ बिंदु पर एक प्रॉक्सी वापस वस्तुओं टी * या टी & की तरह व्यवहार करने के लिए नक्शे की जरूरत है। इटरेटर प्रॉक्सी के लिए, कोई ऑपरेटर अधिभारित कर सकता है ->() और टेम्पलेट टी के इंटरफेस को सभी कार्यक्षमता को दोबारा लागू किए बिना एक्सेस करें। हालांकि, संदर्भ प्रॉक्सी के लिए हैं, तो ऑपरेटर ओवरलोड) की आवश्यकता होगी। (, और कहा कि वर्तमान सी में अनुमति नहीं है ++ (हालांकि Sebastian Redl presented such a proposal on BoostCon 2013)। आप संदर्भ प्रॉक्सी के अंदर एक .Get() सदस्य की तरह एक वर्बोज़ काम के आसपास बना सकते हैं, या संदर्भ के अंदर टी के इंटरफेस के सभी लागू (यह क्या वेक्टर :: bit_reference के लिए किया जाता है), लेकिन यह या तो निर्मित वाक्य रचना खो देंगे या उपयोगकर्ता द्वारा परिभाषित रूपांतरणों को प्रस्तुत करें जिनमें टाइप रूपांतरणों के लिए बिल्टिन सेमेन्टिक्स नहीं हैं (आपके पास प्रति तर्क में एक उपयोगकर्ता द्वारा परिभाषित रूपांतरण हो सकता है)।
** सी ++ 11 ** को 'context_type' की आवश्यकता है __ होने के _lvalue होने के लिए, इसलिए आप कंटेनर आवश्यकताओं को पर्याप्त नहीं करेंगे। –
@ के-बेलो धन्यवाद, मुझे पता है कि यह आवश्यकताओं का हिस्सा है। लेकिन प्रॉक्सी संदर्भ कहां और कैसे सटीक होगा + प्रॉक्सी पॉइंटर्स टूट जाएंगे? – TemplateRex