मैं उस प्रश्न को नहीं ढूंढ पाया, और यह एक वास्तविक समस्या है जिसका सामना कर रहा हूं।कैसे std :: वेक्टर <अहस्ताक्षरित चार> वेक्टर को नकल के बिना <char> कन्वर्ट करने के लिए?
मैं एक फ़ाइल लोड हो रहा है उपयोगिता कि std::vector<unsigned char>
रिटर्न पूरी फ़ाइल सामग्री युक्त है। हालांकि, प्रसंस्करण समारोह char
की contiguos सरणी की आवश्यकता है (और है कि बदला नहीं जा सकता है - यह एक पुस्तकालय समारोह है)। चूंकि प्रसंस्करण फ़ंक्शन का उपयोग करने वाली कक्षा किसी भी तरह से डेटा की एक प्रति संग्रहीत करती है, इसलिए मैं इसे vector<char>
के रूप में स्टोर करना चाहता हूं। यहां कोड है जो थोड़ा अधिक चित्रकारी हो सकता है।
std::vector<unsigned char> LoadFile (std::string const& path);
class Processor {
std::vector<char> cache;
void _dataOperation(std::vector<char> const& data);
public:
void Process() {
if (cache.empty())
// here's the problem!
cache = LoadFile("file.txt");
_dataOperation(cache);
}
};
यह कोड संकलित नहीं करता है, क्योंकि (स्पष्ट रूप से) कोई उचित रूपांतरण नहीं है। हम निश्चित रूप से सुनिश्चित कर सकते हैं कि अस्थायी वेक्टर एक ही मात्रा में स्मृति (आईओयू sizeof(char) == sizeof(unsigned char)
)
बेवकूफ समाधान अस्थायी की सामग्री पर पुनरावृत्ति करना होगा और प्रत्येक चरित्र को कास्ट करना होगा। मुझे पता है कि सामान्य मामले में, operator= (T&&)
कहा जाएगा।
मेरी स्थिति में यह रूपांतरण पुनर्व्याख्या करना सुरक्षित है, क्योंकि मुझे यकीन है कि मैं केवल ASCII वर्ण पढ़ने जा रहा हूँ कर रहा हूँ। किसी अन्य चरित्र को _dataOperation
में वैसे भी पकड़ा जाएगा।
तो, मेरा प्रश्न है: अस्थायी वेक्टर को सही तरीके से और सुरक्षित रूप से कैसे परिवर्तित करना है जिसमें कोई प्रतिलिपि शामिल नहीं है?
यदि यह संभव नहीं है, मैं असुरक्षित noncopying बजाय कॉपी करने का सुरक्षित तरीका पसंद करेंगे। मैं भी LoadFile
बदलने या तो vector<char>
या vector<unsigned char>
वापस जाने के लिए कर सकता है।
यदि आप '_dataOperation' के कोड को नियंत्रित करते हैं, तो आप लंबे समय तक लंबे समय तक खुश रहेंगे यदि आप इसे 'वेक्टर' लेते हैं। दुर्भाग्य से –
zwol
@Zack, मैं नहीं करता। यह एक पुस्तकालय समारोह है। मैं सवाल संपादित करूंगा। –
कोई _safe_ रास्ता –