मैं std :: स्ट्रिंग चार डेटा का स्वामित्व कैसे ले सकता हूं और स्रोत std :: string ऑब्जेक्ट को रखने के साथ? (मैं चलती शब्दावली का उपयोग करना चाहता हूं लेकिन विभिन्न प्रकारों के बीच।)मैं std :: string object को कॉपी और रखे बिना C++ std :: स्ट्रिंग चार डेटा का स्वामित्व कैसे ले सकता हूं?
मैं सी ++ 11 Clang कंपाइलर और Boost का उपयोग करता हूं।
मूल रूप से मैं इस के लिए कुछ बराबर करना चाहते हैं:
{
std::string s(“Possibly very long user string”);
const char* mine = s.c_str();
// 'mine' will be passed along,
pass(mine);
//Made-up call
s.release_data();
// 's' should not release data, but it should properly destroy itself otherwise.
}
, स्पष्ट मैं क्या ज़रूरत है std :: स्ट्रिंग से छुटकारा पाने के लिए: आगे सड़क के नीचे। कोड स्ट्रिंग और बाइनरी डेटा दोनों से संबंधित है और इसे उसी प्रारूप में संभालना चाहिए। और मैं std :: स्ट्रिंग से डेटा चाहता हूं, क्योंकि यह एक और कोड परत से आता है जो std :: string के साथ काम करता है।
अधिक परिप्रेक्ष्य देने के लिए जहां मैं ऐसा करना चाहता हूं: उदाहरण के लिए मेरे पास एक एसिंक्रोनस सॉकेट रैपर है जो लिखने के लिए उपयोगकर्ता से std :: स्ट्रिंग और बाइनरी डेटा दोनों लेने में सक्षम होना चाहिए। दोनों "एपीआई" लिखने वाले संस्करण (std :: स्ट्रिंग या पंक्ति बाइनरी डेटा लेते हुए) आंतरिक रूप से उसी (बाइनरी) लिखने के लिए हल होते हैं। मुझे किसी भी प्रतिलिपि से बचने की आवश्यकता है क्योंकि स्ट्रिंग लंबे हो सकती है।
WriteId write(std::unique_ptr<std::string> strToWrite)
{
// Convert std::string data to contiguous byte storage
// that will be further passed along to other
// functions (also with the moving semantics).
// strToWrite.c_str() would be a solution to my problem
// if I could tell strToWrite to simply give up its
// ownership. Is there a way?
unique_ptr<std::vector<char> > dataToWrite= ??
//
scheduleWrite(dataToWrite);
}
void scheduledWrite(std::unique_ptr< std::vecor<char> > data)
{
…
}
std :: इस उदाहरण में unique_ptr स्वामित्व हस्तांतरण वर्णन करने के लिए: एक ही अर्थ विज्ञान के साथ किसी भी अन्य दृष्टिकोण मेरे लिए ठीक है।
मैं इस विशिष्ट मामले (std :: string char buffer के साथ) और तारों, धाराओं और इसी तरह के सामान्य के साथ इस तरह की समस्या के समाधान के बारे में सोच रहा हूं: स्ट्रिंग, स्ट्रीम, एसडीडी कंटेनर और बफर के बीच चलती बफर तक पहुंचने के लिए युक्तियाँ प्रकार के।
मैं सी ++ डिजाइन दृष्टिकोण और विशिष्ट तकनीकों के साथ युक्तियों और लिंक की भी सराहना करता हूं जब प्रतिलिपि के बिना विभिन्न एपीआई/प्रकारों के बीच बफर डेटा पास करने की बात आती है। मैं उल्लेख करता हूं लेकिन धाराओं का उपयोग नहीं करता क्योंकि मैं उस विषय पर अशक्त हूं।
आप नहीं कर सकते हैं, कोई रास्ता नहीं है क्योंकि वहाँ आप को पुनः प्राप्त कर सकते हैं स्मृति सुरक्षित रूप से। एक बिंदु पर आपको बफर जारी करना चाहिए, तो स्ट्रिंग को सभी तरह से क्यों न रखें, यह स्वचालित रूप से कौन सा होता है? –
आप अपने स्वयं के स्ट्रिंग कार्यान्वयन को बेहतर लिखते हैं – Gigi
'std :: unique_ptr 'एकमात्र चीज होगी जो कुछ भी समान की अनुमति देती है। –
ildjarn