मैं वर्तमान में निम्नलिखित समारोह किसी सरणी या कच्चे डेटा का एक वेक्टर (_readStream
एक std::ifstream
है) को पढ़ने के लिए:यह जांचने के लिए कि क्या Iterators एक संगत स्मृति क्षेत्र बनाते हैं?
template<typename IteratorType>
inline bool MyClass::readRawData(
const IteratorType& first,
const IteratorType& last,
typename std::iterator_traits<IteratorType>::iterator_category* = nullptr
)
{
_readStream.read(reinterpret_cast<char*>(&*first), (last-first)*sizeof(*first));
return _readStream.good();
}
पहला सवाल: इस समारोह आप के लिए ठीक प्रतीत होता है?
जैसा कि हम सीधे स्मृति के एक ब्लॉक को पढ़ते हैं, यह केवल तभी काम करेगा जब मेमोरी ब्लॉक first
से last
स्मृति में संगत है। इसे कैसे जांचें? क्योंकि std::iterator_traits
एक unconditonally परिभाषित सदस्य प्रकार iterator_category
के साथ एक प्राथमिक टेम्पलेट है
आपका फ़ंक्शन इस बारे में बहुत सारी धारणा करता है कि इसका उपयोग कैसे किया जाएगा। यह बेहतर होगा अगर वे स्पष्ट थे, या कम से कम दस्तावेज थे। इन धारणाओं में से: 1) उन तत्वों को स्मृति में उनके द्विआधारी प्रतिनिधित्व द्वारा क्रमबद्ध किया जा सकता है। 2) कि रनटाइम का अंतहीनता डेटा लिखने वाले जैसा ही है। – Cameron
दरअसल, फ़ंक्शन पूरी तरह से गैर-जेनेरिक होने पर इटरेटर का उपयोग क्यों करते हैं? इसका एकमात्र उद्देश्य स्मृति की प्रतिलिपि तत्वों को प्रतिलिपि बनाना है। इसे प्रतिबिंबित करने के लिए फ़ंक्शन का नाम बदलें, और इसे इटरेटर्स की बजाय पॉइंटर और गिनती लें ... आपके शीर्षक में प्रश्न अभी भी दिलचस्प है हालांकि :-) – Cameron
यदि अंतहीनता अलग थी तो डेटा को स्वैप करने के लिए मेरे पास एक और फ़ंक्शन है ताकि आपका दूसरा बिंदु एक समस्या नहीं है। – Vincent